/ Hex Artifact Content
Login

Artifact 2ce3612ab02a87b3c59c30bd412facc0bcc76ee9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2660: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
2670: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
2680: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
2690: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
26a0: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
26b0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
26c0: 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63   A open page cac
26d0: 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  he is an instanc
26e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
26f0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
2700: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
2710: 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f 64  *   Pager.errCod
2720: 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
2730: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
2740: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
2750: 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45 5f  .**   or SQLITE_
2760: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
2770: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
2780: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
2790: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
27a0: 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65    and is returne
27b0: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
27c0: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
27d0: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
27e0: 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  The.**   SQLITE_
27f0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
2800: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
2810: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
2820: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
2830: 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75 63  he.**   next suc
2840: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
2850: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
2860: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2870: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51 4c  . Also,.**   SQL
2880: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
2890: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
28a0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
28b0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
28c0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50 49  ookup().**   API
28d0: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
28e0: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
28f0: 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64 62  sfully..**.** db
2900: 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69 7a  SizeValid, dbSiz
2910: 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20 64  e, dbOrigSize, d
2920: 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bFileSize.**.** 
2930: 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20 73    Managing the s
2940: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2950: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
2960: 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63 6f  s is a little co
2970: 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20 20  mplicated..**   
2980: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
2990: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
29a0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29b0: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
29c0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69 6d  database.**   im
29d0: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
29e0: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
29f0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
2a00: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
2a10: 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c  his.**   variabl
2a20: 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54 68  e is updated. Th
2a30: 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65 72  e variable Pager
2a40: 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74  .dbFileSize cont
2a50: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  ains the number.
2a60: 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69 6e  **   of pages in
2a70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a80: 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65 20  le. This may be 
2a90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 50  different from P
2aa0: 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20 20  ager.dbSize.**  
2ab0: 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20 68   if some pages h
2ac0: 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64 65  ave been appende
2ad0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2ae0: 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74 20  e image but not 
2af0: 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  yet written.**  
2b00: 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61   out from the ca
2b10: 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75 61  che to the actua
2b20: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  l file on disk. 
2b30: 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65 20  Or if the image 
2b40: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74 72  has been.**   tr
2b50: 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e  uncated by an in
2b60: 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
2b70: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20   operation. The 
2b80: 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65  Pager.dbOrigSize
2b90: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 63   variable.**   c
2ba0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
2bb0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2bc0: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2bd0: 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
2be0: 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63 74  nt.**   transact
2bf0: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
2c00: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2c10: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
2c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
2c30: 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61 6e  **   only guaran
2c40: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
2c50: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
2c60: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
2c70: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lid is true..**.
2c80: 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65 72  **   TODO: Under
2c90: 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e 73   what conditions
2ca0: 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64 20   is dbSizeValid 
2cb0: 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a 2a  set? Cleared?.**
2cc0: 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  .** changeCountD
2cd0: 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  one.**.**   This
2ce0: 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c   boolean variabl
2cf0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  e is used to mak
2d00: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
2d10: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
2d20: 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74 65  **   (the 4-byte
2d30: 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61 74   header field at
2d40: 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2d50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2d60: 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20 6e  file) is .**   n
2d70: 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65 20  ot updated more 
2d80: 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65 73  often than neces
2d90: 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49  sary. .**.**   I
2da0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  t is set to true
2db0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   when the change
2dc0: 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 69  -counter field i
2dd0: 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63 68  s updated, which
2de0: 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79 20   .**   can only 
2df0: 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78 63  happen if an exc
2e00: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68  lusive lock is h
2e10: 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
2e20: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
2e30: 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73 65  t is cleared (se
2e40: 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65 6e  t to false) when
2e50: 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69 76  ever an exclusiv
2e60: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20 20  e lock is .**   
2e70: 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e 20  relinquished on 
2e80: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e90: 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 74  e. Each time a t
2ea0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
2eb0: 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54 68  mmitted,.**   Th
2ec0: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
2ed0: 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65 63  e flag is inspec
2ee0: 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74 72  ted. If it is tr
2ef0: 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66 0a  ue, the work of.
2f00: 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74 68  **   updating th
2f10: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2f20: 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72 20   is omitted for 
2f30: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2f40: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2f50: 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20   This mechanism 
2f60: 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e 20  means that when 
2f70: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
2f80: 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f 6e  sive mode, a con
2f90: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e 65  nection .**   ne
2fa0: 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20 74  ed only update t
2fb0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2fc0: 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65 20  r once, for the 
2fd0: 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69 6f  first transactio
2fe0: 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65 64  n.**   committed
2ff0: 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66 69  ..**.** dbModifi
3000: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ed.**.**   The d
3010: 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20 69  bModified flag i
3020: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 61  s set whenever a
3030: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 69   database page i
3040: 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20 20  s dirtied..**   
3050: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61 74  It is cleared at
3060: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
3070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
3080: 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65 64  .**   It is used
3090: 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
30a0: 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65 6e   or otherwise en
30b0: 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ding a transacti
30c0: 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65 20  on. If.**   the 
30d0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
30e0: 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c 65  is clear then le
30f0: 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20 62  ss work has to b
3100: 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f  e done..**.** jo
3110: 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a 0a  urnalStarted.**.
3120: 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20 69  **   This flag i
3130: 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20 74  s set whenever t
3140: 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  he the main jour
3150: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  nal is opened an
3160: 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69 7a  d.**   initializ
3170: 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  ed.**.**   The p
3180: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
3190: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
31a0: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
31b0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
31c0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
31d0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
31e0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
31f0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
3200: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
3210: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
3220: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
3230: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
3240: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
3250: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
3260: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
3270: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
3280: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
3290: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
32a0: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
32b0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
32c0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
32d0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
32e0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
32f0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
3300: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
3310: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
3320: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
3330: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
3340: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
3350: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
3360: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
3370: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
3380: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
3390: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
33a0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
33b0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
33c0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
33d0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
33e0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
33f0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
3400: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
3410: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
3420: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
3430: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
3440: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
3450: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
3460: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
3470: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
3480: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
3490: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
34a0: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
34b0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
34c0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
34d0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
34e0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
34f0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
3500: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
3510: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
3520: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
3530: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
3540: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
3550: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
3560: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
3570: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
3580: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
3590: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
35a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
35b0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
35c0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
35d0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
35e0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 2c 20  .** doNotSpill, 
35f0: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 0a 2a  doNotSyncSpill.*
3600: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
3610: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
3620: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3630: 2e 20 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  .  The doNotSpil
3640: 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  l variable.**   
3650: 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63  inhibits all cac
3660: 68 65 20 73 70 69 6c 6c 20 61 6e 64 20 64 6f 4e  he spill and doN
3670: 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 6e 68 69  otSyncSpill inhi
3680: 62 69 74 73 20 74 68 6f 73 65 20 73 70 69 6c 6c  bits those spill
3690: 73 20 74 68 61 74 0a 2a 2a 20 20 20 77 6f 75 6c  s that.**   woul
36a0: 64 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  d require a jour
36b0: 6e 61 6c 20 73 79 6e 63 2e 20 20 54 68 65 20 64  nal sync.  The d
36c0: 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73  oNotSyncSpill is
36d0: 20 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64   set and cleared
36e0: 20 0a 2a 2a 20 20 20 62 79 20 73 71 6c 69 74 65   .**   by sqlite
36f0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 6e  3PagerWrite() in
3700: 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e   order to preven
3710: 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  t a journal sync
3720: 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20   from happening 
3730: 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65 6e  .**   in between
3740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
3750: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
3760: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
3770: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 64 6f 4e 6f  .  The.**   doNo
3780: 74 53 70 69 6c 6c 20 76 61 6c 75 65 20 73 65 74  tSpill value set
3790: 20 74 6f 20 70 72 65 76 65 6e 74 20 70 61 67 65   to prevent page
37a0: 72 53 74 72 65 73 73 28 29 20 66 72 6f 6d 20 74  rStress() from t
37b0: 72 79 69 6e 67 20 74 6f 20 75 73 65 0a 2a 2a 20  rying to use.** 
37c0: 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75    the journal du
37d0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
37e0: 0a 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a  .**.** needSync.
37f0: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74  **.**   TODO: It
3800: 20 6d 69 67 68 74 20 62 65 20 65 61 73 69 65 72   might be easier
3810: 20 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72   to set this var
3820: 69 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f  iable in writeJo
3830: 75 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20  urnalHdr().**   
3840: 61 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a  and writeMasterJ
3850: 6f 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43  ournal() only. C
3860: 68 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e  hange its meanin
3870: 67 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64  g to "unsynced d
3880: 61 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65  ata.**   has bee
3890: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
38a0: 20 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a   journal"..**.**
38b0: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
38c0: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
38d0: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
38e0: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
38f0: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
3900: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
3910: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
3920: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
3930: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
3940: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
3950: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
3960: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
3970: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
3980: 65 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72  er files..*/.str
3990: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71  uct Pager {.  sq
39a0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
39b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20            /* OS 
39c0: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65  functions to use
39d0: 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20   for IO */.  u8 
39e0: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20  exclusiveMode;  
39f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
3a00: 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63  ean. True if loc
3a10: 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55  king_mode==EXCLU
3a20: 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  SIVE */.  u8 jou
3a30: 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rnalMode;       
3a40: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74        /* On of t
3a50: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
3a60: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
3a70: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
3a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3a90: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
3aa0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
3ab0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
3ac0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
3ad0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
3ae0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
3af0: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
3b00: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b20: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
3b30: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
3b40: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
3b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b60: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
3b70: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
3b80: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
3b90: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
3ba0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
3bb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
3bc0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
3bd0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
3be0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
3bf0: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
3c00: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
3c10: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
3c20: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
3c30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3c40: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
3c50: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3c60: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
3c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3c80: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
3c90: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
3ca0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
3cb0: 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20   block contains 
3cc0: 74 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62  those class memb
3cd0: 65 72 73 20 74 68 61 74 20 61 72 65 20 64 79 6e  ers that are dyn
3ce0: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f  amically.  ** mo
3cf0: 64 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f  dified during no
3d00: 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e  rmal operations.
3d10: 20 54 68 65 20 6f 74 68 65 72 20 76 61 72 69 61   The other varia
3d20: 62 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74 72  bles in this str
3d30: 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20  ucture.  ** are 
3d40: 65 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20  either constant 
3d50: 74 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c  throughout the l
3d60: 69 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70  ifetime of the p
3d70: 61 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20  ager, or else.  
3d80: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
3d90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70   configuration p
3da0: 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61  arameters that a
3db0: 66 66 65 63 74 20 74 68 65 20 77 61 79 20 74 68  ffect the way th
3dc0: 65 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70  e pager .  ** op
3dd0: 65 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  erates..  **.  *
3de0: 2a 20 54 68 65 20 27 73 74 61 74 65 27 20 76 61  * The 'state' va
3df0: 72 69 61 62 6c 65 20 69 73 20 64 65 73 63 72 69  riable is descri
3e00: 62 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61  bed in more deta
3e10: 69 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  il along with th
3e20: 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69  e.  ** descripti
3e30: 6f 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ons of the value
3e40: 73 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20  s it may take - 
3e50: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63  PAGER_UNLOCK etc
3e60: 2e 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20  . Many of the.  
3e70: 2a 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  ** other variabl
3e80: 65 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b  es in this block
3e90: 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20 69   are described i
3ea0: 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69  n the comment di
3eb0: 72 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f  rectly .  ** abo
3ec0: 76 65 20 74 68 69 73 20 63 6c 61 73 73 20 64 65  ve this class de
3ed0: 66 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  finition..  */. 
3ee0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3f00: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
3f10: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
3f20: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64  , etc. */.  u8 d
3f30: 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20  bModified;      
3f40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f50: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
3f60: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
3f70: 44 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  Db */.  u8 needS
3f80: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3f90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
3fa0: 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65  n fsync() is nee
3fb0: 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  ded on the journ
3fc0: 61 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  al */.  u8 journ
3fd0: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3fe0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3ff0: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
4000: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
4010: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
4020: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
4030: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
4040: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
4050: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
4060: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
4070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4080: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
4090: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
40a0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
40b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
40c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
40d0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
40e0: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
40f0: 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  o */.  u8 doNotS
4100: 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  yncSpill;       
4110: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     /* Do not do 
4120: 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71  a spill that req
4130: 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20  uires jrnl sync 
4140: 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61  */.  u8 dbSizeVa
4150: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
4160: 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53   /* Set when dbS
4170: 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a  ize is correct *
4180: 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d  /.  u8 subjInMem
4190: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ory;            
41a0: 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69  /* True to use i
41b0: 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
41c0: 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  rnals */.  Pgno 
41d0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
41e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
41f0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4200: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
4210: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
4220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4230: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4240: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
4250: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
4260: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
4270: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4280: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
4290: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
42a0: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42c0: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
42d0: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
42e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
4310: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
4320: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
4330: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
4340: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
4350: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
4360: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
4370: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
4380: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
4390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
43b0: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
43c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43d0: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
43e0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
43f0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
4400: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
4410: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
4420: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
4430: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
4440: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
4450: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
4460: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4470: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
4480: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4490: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
44a0: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
44b0: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
44c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
44d0: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
44e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
44f0: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
4500: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4510: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
4520: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
4530: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
4540: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
4550: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
4560: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
4570: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
4580: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
4590: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
45a0: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
45b0: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
45c0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 50  nal files */.  P
45d0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
45e0: 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72  Savepoint; /* Ar
45f0: 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73 61  ray of active sa
4600: 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  vepoints */.  in
4610: 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  t nSavepoint;   
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4630: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4640: 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  in aSavepoint[] 
4650: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
4660: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
4670: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
4680: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
4690: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  le changes */.  
46a0: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
46c0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
46d0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
46e0: 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ck */..  u16 nEx
46f0: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
4700: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
4710: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
4720: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
4730: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
4740: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
4750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4760: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
4770: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
4780: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
4790: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
47a0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
47b0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
47c0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  n() */.  int pag
47d0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
47e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
47f0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
4800: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
4810: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
4820: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
4830: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
4840: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
4850: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
4860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4870: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
4880: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ase file */.  ch
4890: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
48a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
48b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
48c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28   file */.  int (
48d0: 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
48e0: 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69  oid*); /* Functi
48f0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20  on to call when 
4900: 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  busy */.  void *
4910: 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
4920: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
4930: 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42   argument for xB
4940: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69  usyHandler */.#i
4950: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4960: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
4970: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
4980: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
4990: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
49a0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
49b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
49c0: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
49d0: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
49e0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
49f0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
4a00: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
4a10: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
4a20: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
4a30: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
4a40: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
4a50: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
4a60: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
4a70: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
4a80: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
4a90: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
4aa0: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
4ab0: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
4ac0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
4ad0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
4ae0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
4af0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
4b00: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
4b10: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
4b20: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
4b30: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
4b40: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4b50: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
4b60: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
4b70: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
4b80: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
4b90: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
4ba0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
4bb0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
4bc0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
4bd0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
4be0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
4bf0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
4c00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
4c10: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
4c20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
4c30: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
4c40: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
4c50: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
4c60: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
4c70: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
4c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
4c90: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
4ca0: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
4cb0: 65 3d 77 61 6c 22 20 2a 2f 0a 23 65 6e 64 69 66  e=wal" */.#endif
4cc0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
4cd0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
4ce0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
4cf0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
4d00: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
4d10: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
4d20: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
4d30: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
4d40: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
4d50: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
4d60: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
4d70: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
4d80: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
4d90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4da0: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
4db0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4dc0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
4dd0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
4de0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4df0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
4e00: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
4e10: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
4e20: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
4e30: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
4e40: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
4e50: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
4e60: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
4e70: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
4e80: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
4e90: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
4ea0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4eb0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
4ec0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
4ed0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
4ee0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
4ef0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
4f00: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
4f10: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
4f20: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
4f30: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
4f40: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
4f50: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
4f60: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
4f70: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
4f80: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
4f90: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
4fa0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
4fb0: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
4fc0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
4fd0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
4fe0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
4ff0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
5000: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
5010: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
5020: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
5030: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
5040: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
5050: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
5060: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
5070: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
5080: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
5090: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
50a0: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
50b0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
50c0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
50d0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
50e0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
50f0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
5100: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
5110: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
5120: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
5130: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
5140: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
5150: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
5160: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
5170: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
5180: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
5190: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
51a0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
51b0: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
51c0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
51d0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
51e0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
51f0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
5200: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
5210: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
5220: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
5230: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
5240: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
5250: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
5260: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
5270: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
5280: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
5290: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
52a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
52b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
52c0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
52d0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
52e0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
52f0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
5300: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
5310: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
5320: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
5330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
5340: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
5350: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
5360: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
5370: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
5380: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
5390: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
53a0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
53b0: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
53c0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
53d0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
53e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
53f0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
5400: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
5410: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
5420: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
5430: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
5440: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
5450: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
5460: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
5470: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
5480: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
5490: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
54a0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
54b0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
54c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
54d0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
54e0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
54f0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
5500: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
5510: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
5520: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
5530: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
5540: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
5550: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
5560: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5570: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5580: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5590: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
55a0: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
55b0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
55c0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
55d0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
55e0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
55f0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
5600: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
5610: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
5620: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
5630: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
5640: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
5650: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5660: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5670: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5680: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5690: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
56a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
56b0: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
56c0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
56d0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
56e0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
56f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5700: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
5710: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
5720: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
5730: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
5740: 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66  7483647..#ifndef
5750: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
5760: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
5770: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
5780: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
5790: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
57a0: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
57b0: 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
57c0: 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d  er){..  /* A tem
57d0: 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  p-file is always
57e0: 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53   in PAGER_EXCLUS
57f0: 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e  IVE or PAGER_SYN
5800: 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  CED state. */.  
5810: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
5820: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
5830: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
5840: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
5850: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
5860: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
5870: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f  is always set fo
5880: 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a  r temp-files */.
5890: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
58a0: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
58b0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
58c0: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72  ountDone );..  r
58d0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
58e0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
58f0: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
5900: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
5910: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
5920: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
5930: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
5940: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5950: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
5960: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
5970: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
5980: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
5990: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
59a0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
59b0: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
59c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
59d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
59e0: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
59f0: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
5a00: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
5a10: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
5a20: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
5a30: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
5a40: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
5a50: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
5a60: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
5a70: 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20  r *pPg){.  Pgno 
5a80: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
5a90: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
5aa0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
5ab0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5ac0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
5ad0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
5ae0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
5af0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
5b00: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
5b10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
5b20: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
5b30: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
5b40: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
5b50: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
5b60: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
5b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5b80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5b90: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
5ba0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
5bb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5bd0: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
5be0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
5bf0: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
5c00: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
5c10: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
5c20: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
5c30: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
5c40: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
5c50: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5c60: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
5c70: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
5c80: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
5c90: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
5ca0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
5cb0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
5cc0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
5cd0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
5ce0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
5cf0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
5d00: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
5d10: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
5d20: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
5d30: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
5d40: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
5d50: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
5d60: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5d70: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
5d80: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
5d90: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
5da0: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
5db0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5dc0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
5dd0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5de0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
5df0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5e00: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
5e10: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
5e20: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
5e30: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
5e40: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
5e50: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
5e60: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
5e70: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
5e80: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5e90: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
5ea0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5eb0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
5ec0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
5ed0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
5ee0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
5ef0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5f00: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5f10: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
5f20: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
5f30: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
5f40: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
5f50: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
5f60: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
5f70: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
5f80: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
5f90: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  et);.}../*.** Th
5fa0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
5fb0: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
5fc0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
5fd0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
5fe0: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
5ff0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
6000: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
6010: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
6020: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
6030: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
6040: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
6050: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
6060: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
6070: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
6080: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
6090: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
60a0: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
60b0: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
60c0: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
60d0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
60e0: 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ds)../*.** If fi
60f0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
6100: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
6110: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
6120: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
6130: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
6140: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
6150: 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  k){.  if( !isOpe
6160: 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65  n(pFd) ){.    re
6170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
6190: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64  ite3OsUnlock(pFd
61a0: 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
61b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
61c0: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
61d0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
61e0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
61f0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
6200: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
6210: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
6220: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
6230: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
6240: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
6250: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
6260: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
6270: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
6280: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
6290: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
62a0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
62b0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
62c0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
62d0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
62e0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
62f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
6300: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
6310: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
6320: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
6330: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
6340: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
6350: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
6360: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
6370: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
6380: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
6390: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
63a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
63b0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
63c0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
63d0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
63e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
63f0: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
6400: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
6410: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
6420: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
6430: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
6440: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
6450: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
6460: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
6470: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
6480: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
6490: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
64a0: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
64b0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
64c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
64d0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
64e0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
64f0: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
6520: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
6530: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
6540: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
6550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
6560: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
6570: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
65a0: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
65b0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
65c0: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
65d0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
65e0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
65f0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
6600: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
6610: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
6620: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
6630: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
6640: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
6650: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
6660: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
6670: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
6680: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
6690: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
66a0: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
66b0: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
66c0: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
66d0: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
66e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
66f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
6700: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
6710: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
6720: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
6730: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
6740: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
6750: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
6760: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
6770: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
6780: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
6790: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
67a0: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
67b0: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
67c0: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
67d0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
67e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
67f0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
6800: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
6810: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
6820: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
6830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
6840: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
6850: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
6860: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
6870: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
6880: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6890: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
68a0: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
68b0: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
68c0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
68d0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
68e0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
68f0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
6900: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
6910: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
6920: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
6930: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
6940: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
6950: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
6960: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
6970: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
6980: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
6990: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
69a0: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
69b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
69c0: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
69d0: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
69e0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
69f0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
6a00: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
6a10: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
6a20: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
6a30: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
6a40: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
6a50: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
6a60: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
6a70: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
6a80: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
6a90: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
6aa0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
6ab0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
6ac0: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
6ad0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
6ae0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6af0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
6b00: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
6b10: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
6b20: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
6b30: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
6b40: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
6b50: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
6b60: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
6b70: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
6b80: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
6b90: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
6ba0: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
6bb0: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
6bc0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
6bd0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
6be0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
6bf0: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
6c00: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
6c10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6c20: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
6c30: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
6c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
6c50: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
6c60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6c70: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
6c80: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
6c90: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
6ca0: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
6cb0: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
6cc0: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
6cd0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
6ce0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
6cf0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
6d00: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
6d10: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
6d20: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
6d30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6d40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
6d50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
6d60: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
6d70: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
6d80: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
6d90: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
6da0: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
6db0: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
6dc0: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
6dd0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
6de0: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
6df0: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
6e00: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
6e10: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6e20: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
6e30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
6e40: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
6e50: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
6e60: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
6e70: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
6e80: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
6e90: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
6ea0: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
6eb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6ec0: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
6ed0: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
6ee0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
6ef0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
6f00: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
6f10: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
6f20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
6f30: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
6f40: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
6f50: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
6f60: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
6f70: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
6f80: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
6f90: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
6fa0: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
6fb0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
6fc0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
6fd0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
6fe0: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
6ff0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7000: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
7010: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
7020: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
7030: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
7040: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
7050: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
7060: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
7070: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
7080: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
7090: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
70a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
70b0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
70c0: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
70d0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
70e0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
70f0: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
7100: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
7120: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
7130: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
7140: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
7150: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
7160: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7170: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
71a0: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
71b0: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
71c0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71e0: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
71f0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
7200: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
7210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7220: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
7230: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
7240: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
7250: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
7260: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
7270: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
7280: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
7290: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
72a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
72b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
72c0: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
72d0: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
72e0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
72f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
7300: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
7310: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
7320: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
7330: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
7340: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
7350: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
7360: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
7370: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
7380: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
7390: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
73a0: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
73b0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
73c0: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
73d0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
73e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
73f0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
7400: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
7410: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
7420: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
7430: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
7440: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
7450: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7460: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
7470: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
7480: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
7490: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
74a0: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
74b0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
74c0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
74d0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
74e0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
74f0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
7500: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
7510: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
7520: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
7530: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
7540: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
7550: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
7560: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
7570: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
7580: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
7590: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
75a0: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
75b0: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
75c0: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
75d0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
75e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
75f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7600: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
7610: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
7620: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
7630: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
7640: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
7650: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7660: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
7670: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
7680: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
7690: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
76a0: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
76b0: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
76c0: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
76d0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
76e0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
76f0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
7720: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
7730: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
7740: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
7750: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
7760: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
7780: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77a0: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
77b0: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
77c0: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
77d0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
77e0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
77f0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
7800: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
7810: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
7820: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
7830: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
7840: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
7850: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
7860: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7870: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
7880: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
7890: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
78a0: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
78b0: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
78c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
78d0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
78e0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
78f0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
7900: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
7910: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
7920: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
7930: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
7940: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
7950: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
7960: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
7970: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
7980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
7990: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
79a0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
79b0: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
79c0: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
79d0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
79e0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
79f0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
7a00: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
7a10: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
7a20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
7a30: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
7a40: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
7a50: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
7a60: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
7a70: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
7a80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
7a90: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
7aa0: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
7ab0: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
7ac0: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
7ad0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
7ae0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
7af0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
7b00: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
7b10: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
7b20: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
7b30: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
7b40: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
7b50: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
7b60: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
7b70: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
7b80: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
7b90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
7ba0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
7bb0: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
7bc0: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
7bd0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
7be0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
7bf0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
7c00: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
7c10: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
7c20: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
7c30: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
7c40: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
7c50: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
7c60: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
7c70: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
7c80: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
7c90: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
7ca0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
7cb0: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
7cc0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
7cd0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
7ce0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
7cf0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
7d00: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
7d10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d40: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
7d50: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
7d60: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
7d70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
7d80: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
7d90: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
7da0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
7db0: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
7dc0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
7dd0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
7de0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
7df0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
7e00: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
7e10: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
7e20: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
7e30: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
7e40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
7e50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7e60: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7e70: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
7e80: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
7e90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7ea0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
7eb0: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
7ec0: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
7ed0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
7ee0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
7ef0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
7f00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7f10: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
7f20: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
7f30: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
7f40: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
7f50: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
7f60: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
7f70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
7f80: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
7f90: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
7fa0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
7fb0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
7fc0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
7fd0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
7fe0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
7ff0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
8000: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
8010: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
8020: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
8030: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
8040: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
8050: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
8060: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
8070: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
8080: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
8090: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
80a0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
80b0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
80c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
80d0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
80e0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
80f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
8100: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
8110: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
8120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8130: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
8140: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
8150: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8160: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
8170: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
8180: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8190: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
81a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
81b0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
81c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
81d0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
81e0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
81f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
8200: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
8210: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
8220: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
8230: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
8240: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
8250: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
8260: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
8270: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
8280: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
8290: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
82a0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
82b0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
82c0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
82d0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
82e0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
82f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
8300: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
8310: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
8320: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
8330: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
8340: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
8350: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
8360: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
8370: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
8380: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
8390: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
83a0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
83b0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
83c0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
83d0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
83e0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
83f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8400: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
8410: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8420: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8430: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
8440: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8450: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
8460: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
8470: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
8480: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
8490: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
84a0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
84b0: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
84c0: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
84d0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
84e0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
84f0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
8500: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8520: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
8530: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
8540: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8570: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
8580: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
8590: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
85a0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
85b0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
85c0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
85d0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
85e0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
85f0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
8600: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
8610: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
8620: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
8630: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
8640: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
8650: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
8660: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
8670: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
8680: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
8690: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
86a0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
86b0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
86c0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
86d0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
86e0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
86f0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
8700: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
8710: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
8720: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
8730: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
8740: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
8750: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
8760: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
8770: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
8780: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
8790: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
87a0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
87b0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
87c0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
87d0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
87e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
87f0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
8800: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
8810: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
8820: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
8830: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
8840: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
8850: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
8860: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
8870: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
8880: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
8890: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
88a0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
88b0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
88c0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
88d0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
88e0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
88f0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
8900: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
8910: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
8920: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
8930: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
8940: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
8950: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
8960: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
8970: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
8980: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
8990: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
89a0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
89b0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
89c0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
89d0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
89e0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
89f0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
8a00: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
8a10: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
8a20: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
8a30: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
8a40: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
8a50: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
8a60: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
8a70: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
8a80: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
8a90: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
8aa0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
8ab0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
8ac0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
8ad0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
8ae0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
8af0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
8b00: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
8b10: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
8b20: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
8b30: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
8b40: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
8b50: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
8b60: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
8b70: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
8b80: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
8b90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
8ba0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
8bb0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
8bc0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
8bd0: 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  c );.  if( (pPag
8be0: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28  er->noSync) || (
8bf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
8c00: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
8c10: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20  ALMODE_MEMORY). 
8c20: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
8c30: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
8c40: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
8c50: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
8c60: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
8c70: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  .    memcpy(zHea
8c80: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
8c90: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
8ca0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
8cb0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8cc0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8cd0: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
8ce0: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
8cf0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61  .    memset(zHea
8d00: 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  der, 0, sizeof(a
8d10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29  JournalMagic)+4)
8d20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
8d30: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
8d40: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
8d50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
8d60: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
8d70: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
8d80: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
8d90: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
8da0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
8db0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8dc0: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
8dd0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
8de0: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
8df0: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
8e00: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
8e10: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
8e20: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
8e30: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a  r->dbOrigSize);.
8e40: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
8e50: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
8e60: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
8e70: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
8e80: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8e90: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
8ea0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
8eb0: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ize);..  /* The 
8ec0: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  page size */.  p
8ed0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8ee0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8ef0: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
8f00: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
8f10: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
8f20: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
8f30: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
8f40: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
8f50: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
8f60: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
8f70: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
8f80: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
8f90: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
8fa0: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
8fb0: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
8fc0: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
8fd0: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
8fe0: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
8ff0: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
9000: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
9010: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
9020: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9030: 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20  gic)+20], 0,.   
9040: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
9050: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9060: 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a  gic)+20));..  /*
9070: 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69   In theory, it i
9080: 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79  s only necessary
9090: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38   to write the 28
90a0: 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20   bytes that the 
90b0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
90c0: 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f  ader consumes to
90d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
90e0: 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63  e here. Then inc
90f0: 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a  rement the .  **
9100: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
9110: 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f  f variable by JO
9120: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20  URNAL_HDR_SZ so 
9130: 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20  that the next . 
9140: 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72   ** record is wr
9150: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c  itten to the fol
9160: 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c  lowing sector (l
9170: 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20  eaving a gap in 
9180: 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68  the file.  ** th
9190: 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69  at will be impli
91a0: 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20  citly filled in 
91b0: 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a  by the OS)..  **
91c0: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74  .  ** However it
91d0: 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76   has been discov
91e0: 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d  ered that on som
91f0: 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70  e systems this p
9200: 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a  attern can .  **
9210: 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c   be significantl
9220: 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f  y slower than co
9230: 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69  ntiguously writi
9240: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ng data to the f
9250: 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69  ile,.  ** even i
9260: 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70  f that means exp
9270: 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20  licitly writing 
9280: 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63  data to the bloc
9290: 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52  k of .  ** (JOUR
92a0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
92b0: 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c   bytes that will
92c0: 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f   not be used. So
92d0: 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20   that is what.  
92e0: 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a  ** is done. .  *
92f0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20  *.  ** The loop 
9300: 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65  is required here
9310: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63   in case the sec
9320: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
9330: 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
9340: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
9350: 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20  size. Since the 
9360: 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69  zHeader buffer i
9370: 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67  s only Pager.pag
9380: 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73  eSize.  ** bytes
9390: 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74   in size, more t
93a0: 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  han one call to 
93b0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
93c0: 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64   may be required
93d0: 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74  .  ** to populat
93e0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
93f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
9400: 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  or..  */ .  for(
9410: 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51  nWrite=0; rc==SQ
9420: 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c  LITE_OK&&nWrite<
9430: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9440: 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d  Pager); nWrite+=
9450: 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f  nHeader){.    IO
9460: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
9470: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
9480: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
9490: 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29  nalHdr, nHeader)
94a0: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
94b0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
94c0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
94d0: 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d  nHeader, pPager-
94e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
94f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9500: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20  ->journalHdr <= 
9510: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9520: 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ff );.    pPager
9530: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9540: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
9550: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9560: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
9570: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
9580: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
9590: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
95a0: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
95b0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
95c0: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
95d0: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
95e0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
95f0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
9600: 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   The current loc
9610: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
9620: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76  rnal file is giv
9630: 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d  en by.** pPager-
9640: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65  >journalOff. See
9650: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
9660: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
9670: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a  urnalHdr() for.*
9680: 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  * a description 
9690: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
96a0: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
96b0: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
96c0: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
96d0: 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69  sfully, *pNRec i
96e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
96f0: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
9700: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
9710: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
9720: 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74   *pDbSize is set
9730: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
9740: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
9750: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
9760: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
9770: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
9780: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
9790: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
97a0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
97b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
97c0: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
97d0: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
97e0: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
97f0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
9800: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
9810: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
9820: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
9830: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
9840: 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20   and *pNRec and 
9850: 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64  *PDbSize are und
9860: 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52  efined.  If JOUR
9870: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
9880: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
9890: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
98a0: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
98b0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
98c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
98d0: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
98e0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
98f0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
9900: 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
9910: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c   */.  int isHot,
9920: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
9930: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
9940: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
9950: 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
9960: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
9970: 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20  32 *pNRec,      
9980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9990: 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66  UT: Value read f
99a0: 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65  rom the nRec fie
99b0: 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62  ld */.  u32 *pDb
99c0: 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
99d0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
99e0: 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64  ue of original d
99f0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69 65  atabase size fie
9a00: 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ld */.){.  int r
9a10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
9a20: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9a30: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69  n code */.  unsi
9a40: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
9a50: 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75  [8];     /* A bu
9a60: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
9a70: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
9a80: 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75  /* Offset of jou
9ab0: 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e  rnal header bein
9ac0: 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  g read */..  ass
9ad0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
9ae0: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
9af0: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
9b00: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
9b10: 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  /..  /* Advance 
9b20: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
9b30: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
9b40: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
9b50: 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  . If the.  ** jo
9b60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f  urnal file is to
9b70: 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72  o small for ther
9b80: 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65 72  e to be a header
9b90: 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a   stored at this.
9ba0: 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75    ** point, retu
9bb0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
9bc0: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a    */.  pPager->j
9bd0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
9be0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
9bf0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
9c00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
9c10: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9c20: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
9c30: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
9c40: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
9c50: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
9c60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9c70: 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  f;..  /* Read in
9c80: 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79 74   the first 8 byt
9c90: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
9ca0: 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68 65  l header. If the
9cb0: 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20  y do not match. 
9cc0: 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73   ** the  magic s
9cd0: 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74  tring found at t
9ce0: 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
9cf0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
9d00: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
9d10: 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20  ITE_DONE. If an 
9d20: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
9d30: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
9d40: 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
9d50: 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  ,.  ** proceed..
9d60: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74    */.  if( isHot
9d70: 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61   || iHdrOff!=pPa
9d80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
9d90: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
9da0: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
9db0: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
9dc0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69  izeof(aMagic), i
9dd0: 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28  HdrOff);.    if(
9de0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
9df0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
9e00: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
9e10: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
9e20: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
9e30: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  c))!=0 ){.      
9e40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9e50: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
9e60: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72   /* Read the fir
9e70: 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74 20  st three 32-bit 
9e80: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f  fields of the jo
9e90: 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68  urnal header: Th
9ea0: 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c  e nRec.  ** fiel
9eb0: 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d  d, the checksum-
9ec0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20  initializer and 
9ed0: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
9ee0: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a 20  e at the start. 
9ef0: 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73   ** of the trans
9f00: 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61  action. Return a
9f10: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
9f20: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
9f30: 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ong..  */.  if( 
9f40: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
9f50: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
9f60: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9f70: 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c  +8, pNRec)).   |
9f80: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
9f90: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9fa0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9fb0: 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e  ff+12, &pPager->
9fc0: 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c  cksumInit)).   |
9fd0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
9fe0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
9ff0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a000: 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29  ff+16, pDbSize))
a010: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
a020: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
a030: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a040: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ff==0 ){.    u32
a050: 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20   iPageSize;     
a060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
a070: 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
a080: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
a090: 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74 6f  /.    u32 iSecto
a0a0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
a0b0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a     /* Sector-siz
a0c0: 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
a0d0: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
a0e0: 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31 36   u16 iPageSize16
a0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a100: 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53 69   Copy of iPageSi
a110: 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61 72  ze in 16-bit var
a120: 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  iable */..    /*
a130: 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
a140: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
a150: 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
a160: 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
a170: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
a180: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
a190: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
a1a0: 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
a1b0: 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
a1c0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
a1d0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
a1e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
a1f0: 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
a200: 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
a210: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a220: 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
a230: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
a240: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
a250: 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
a260: 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
a270: 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
a280: 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
a290: 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
a2a0: 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
a2b0: 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
a2c0: 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
a2d0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
a2e0: 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
a2f0: 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
a300: 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
a310: 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
a320: 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
a330: 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
a340: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
a350: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
a360: 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
a370: 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
a380: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
a390: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
a3a0: 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
a3b0: 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
a3c0: 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
a3d0: 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
a3e0: 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
a3f0: 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
a400: 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
a410: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
a420: 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
a430: 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
a440: 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
a450: 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
a460: 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
a470: 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
a480: 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
a490: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
a4a0: 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
a4b0: 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
a4c0: 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
a4d0: 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
a4e0: 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
a4f0: 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
a500: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
a510: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a530: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
a540: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
a550: 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
a560: 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
a570: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
a580: 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
a590: 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
a5a0: 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
a5b0: 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
a5c0: 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
a5d0: 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
a5e0: 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
a5f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67 65      */.    iPage
a600: 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69 50  Size16 = (u16)iP
a610: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
a620: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
a630: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
a640: 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c 20  , &iPageSize16, 
a650: 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
a660: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
a670: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a680: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a690: 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28 75   iPageSize16==(u
a6a0: 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a  16)iPageSize );.
a6b0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
a6c0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a6d0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
a6e0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
a6f0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
a700: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
a710: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
a720: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
a730: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
a740: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
a750: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
a760: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
a770: 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
a780: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
a790: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
a7a0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
a7b0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
a7c0: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
a7d0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
a7e0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
a7f0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
a800: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
a810: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
a820: 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
a830: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
a840: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
a850: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a860: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a870: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
a880: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
a890: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a8a0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
a8b0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
a8c0: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
a8d0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
a8e0: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
a8f0: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
a900: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
a910: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
a920: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
a930: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
a940: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
a950: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
a960: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
a970: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
a980: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
a990: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
a9a0: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
a9b0: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
a9c0: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
a9d0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
a9e0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
a9f0: 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
aa00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
aa10: 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
aa20: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
aa30: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
aa40: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
aa50: 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
aa60: 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
aa70: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
aa80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
aa90: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
aaa0: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
aab0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
aac0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
aad0: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
aae0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
aaf0: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
ab00: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
ab10: 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
ab20: 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
ab30: 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
ab40: 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
ab50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
ab60: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
ab70: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
ab80: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
ab90: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
aba0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
abb0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
abc0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
abd0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
abe0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
abf0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
ac00: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
ac30: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
ac40: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
ac50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
ac60: 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
ac70: 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
ac80: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
ac90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
aca0: 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
acb0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
acc0: 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
acd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ace0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
acf0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
ad00: 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
ad10: 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
ad20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
ad30: 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
ad40: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 69   zMaster */..  i
ad50: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
ad60: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
ad70: 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
ad80: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ad90: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
ada0: 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67  MORY .   || pPag
adb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
adc0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
add0: 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20  DE_OFF .  ){.   
ade0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
adf0: 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
ae00: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
ae10: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
ae20: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
ae30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ae40: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
ae50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ae60: 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
ae70: 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
ae80: 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
ae90: 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
aea0: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
aeb0: 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
aec0: 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
aed0: 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
aee0: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
aef0: 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
af00: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
af10: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
af20: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
af30: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
af40: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
af50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
af60: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
af70: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
af80: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
af90: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
afa0: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
afb0: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
afc0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
afd0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
afe0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
aff0: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
b000: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
b010: 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
b020: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b030: 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
b040: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b050: 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
b060: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b070: 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
b080: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
b090: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
b0a0: 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
b0b0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
b0c0: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
b0d0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
b0e0: 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
b0f0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
b100: 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
b110: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
b120: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
b130: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
b140: 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
b150: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
b160: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
b170: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
b180: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
b190: 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
b1a0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
b1b0: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
b1c0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
b1d0: 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
b1e0: 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
b1f0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
b200: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
b210: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
b220: 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  , 8, iHdrOff+4+n
b230: 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b  Master+8))).  ){
b240: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
b250: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
b260: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61  urnalOff += (nMa
b270: 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67  ster+20);.  pPag
b280: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
b290: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
b2a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
b2b0: 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
b2c0: 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
b2d0: 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
b2e0: 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
b2f0: 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
b300: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
b310: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
b320: 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
b330: 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
b340: 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
b350: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
b360: 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
b370: 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
b380: 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
b390: 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
b3a0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
b3b0: 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
b3c0: 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
b3d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
b3e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
b3f0: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
b400: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
b410: 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
b420: 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
b430: 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
b440: 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
b450: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
b460: 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
b470: 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
b480: 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
b490: 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
b4a0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b4b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
b4c0: 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
b4d0: 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
b4e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
b4f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b500: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
b510: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
b520: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
b530: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b540: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
b550: 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
b560: 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
b570: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
b580: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
b590: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
b5a0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
b5b0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
b5c0: 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
b5d0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
b5e0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
b5f0: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
b600: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
b610: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
b640: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
b650: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
b660: 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
b670: 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
b680: 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
b690: 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
b6a0: 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
b6b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
b6c0: 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
b6d0: 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
b6e0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
b6f0: 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
b700: 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
b710: 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
b720: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
b730: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
b740: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
b750: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
b760: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66  memory pages. If
b770: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 73  .** the pager is
b780: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
b790: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20   then this call 
b7a0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
b7b0: 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20  * TODO: Why can 
b7c0: 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65  we not reset the
b7d0: 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20   pager while in 
b7e0: 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a  error state?.*/.
b7f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
b800: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
b810: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51  Pager){.  if( SQ
b820: 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d  LITE_OK==pPager-
b830: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
b840: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
b850: 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
b860: 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ckup);.    sqlit
b870: 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
b880: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
b890: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
b8a0: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
b8b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
b8c0: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
b8d0: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
b8e0: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
b8f0: 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
b900: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
b910: 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
b920: 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
b930: 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
b940: 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
b950: 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
b960: 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
b970: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
b980: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
b990: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
b9a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b9b0: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
b9c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
b9d0: 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
b9e0: 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
b9f0: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
ba00: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
ba10: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ba20: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
ba30: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
ba40: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
ba50: 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
ba60: 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
ba70: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
ba80: 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
ba90: 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
baa0: 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
bab0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
bac0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
bad0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
bae0: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
baf0: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
bb00: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
bb10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
bb20: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
bb30: 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
bb40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
bb50: 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
bb60: 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
bb70: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
bb80: 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
bb90: 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
bba0: 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
bbb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
bbc0: 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
bbd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
bbe0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
bbf0: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
bc00: 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
bc10: 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
bc20: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
bc30: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
bc40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bc50: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bc60: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
bc70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
bc80: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bc90: 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
bca0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
bcb0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
bcc0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
bcd0: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
bce0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
bcf0: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
bd00: 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
bd10: 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
bd20: 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
bd30: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
bd40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bd50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bd60: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
bd70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bd80: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
bd90: 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
bda0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
bdb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
bdc0: 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72  ue if this pager
bdd0: 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68   uses a write-ah
bde0: 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20  ead log instead 
bdf0: 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20  of the usual.** 
be00: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
be10: 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73  . Otherwise fals
be20: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
be30: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74  LITE_OMIT_WAL.st
be40: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73  atic int pagerUs
be50: 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  eWal(Pager *pPag
be60: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
be70: 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b  Pager->pWal!=0);
be80: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
be90: 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29  e pagerUseWal(x)
bea0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
beb0: 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20  rRollbackWal(x) 
bec0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
bed0: 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c  WalFrames(v,w,x,
bee0: 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65 20  y,z) 0.# define 
bef0: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
bf00: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
bf10: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
bf20: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
bf30: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
bf40: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
bf50: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
bf60: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
bf70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
bf80: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
bf90: 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75 73  .** is in exclus
bfa0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ive mode..**.** 
bfb0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
bfc0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
bfd0: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
bfe0: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
bff0: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
c000: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
c010: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
c020: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
c030: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
c040: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
c050: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
c060: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
c070: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
c080: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
c090: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
c0a0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
c0b0: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
c0c0: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
c0d0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
c0e0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
c0f0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
c100: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
c110: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
c120: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
c130: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
c140: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
c160: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
c170: 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
c180: 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
c190: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
c1a0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
c1b0: 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
c1c0: 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
c1d0: 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
c1e0: 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
c1f0: 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
c200: 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
c210: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c220: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
c230: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
c240: 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
c250: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
c260: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
c270: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
c280: 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
c290: 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
c2a0: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
c2b0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
c2c0: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
c2d0: 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
c2e0: 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
c2f0: 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
c300: 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
c310: 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
c320: 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
c330: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
c340: 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
c350: 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
c360: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
c370: 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
c380: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
c390: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
c3a0: 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
c3b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
c3c0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
c3d0: 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
c3e0: 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
c3f0: 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
c400: 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
c410: 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
c420: 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
c430: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
c440: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
c450: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
c460: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
c470: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  ..    sqlite3Bit
c480: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
c490: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
c4a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
c4b0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
c4c0: 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
c4d0: 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20  ints(pPager);.. 
c4e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
c4f0: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73  e is unlocked, s
c500: 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67  omebody else mig
c510: 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68  ht change it. Th
c520: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
c530: 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
c540: 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68  dbSize etc. migh
c550: 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64  t become invalid
c560: 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   if.    ** this 
c570: 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63 61  happens.  One ca
c580: 6e 20 61 72 67 75 65 20 74 68 61 74 20 74 68 69  n argue that thi
c590: 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74  s doesn't need t
c5a0: 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20 20  o be cleared.   
c5b0: 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 68   ** until the ch
c5c0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68 65  ange-counter che
c5d0: 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61 67 65  ck fails in Page
c5e0: 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20  rSharedLock().. 
c5f0: 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20 74     ** Clearing t
c600: 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61 63  he page size cac
c610: 68 65 20 68 65 72 65 20 69 73 20 62 65 69 6e 67  he here is being
c620: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a 20   conservative.. 
c630: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
c640: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
c650: 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  0;..    if( page
c660: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
c670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c680: 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
c690: 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
c6a0: 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
c6b0: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c        rc = osUnl
c6c0: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
c6d0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  NO_LOCK);.    }.
c6e0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
c6f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
c700: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a  ode = rc;.    }.
c710: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c720: 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOCK %p\n", pPag
c730: 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er))..    /* If 
c740: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
c750: 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
c760: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
c770: 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
c780: 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20      ** trusted. 
c790: 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  Now that the pag
c7a0: 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  er file is unloc
c7b0: 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ked, the content
c7c0: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
c7d0: 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
c7e0: 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65  carded and the e
c7f0: 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79  rror code safely
c800: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
c810: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c820: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
c830: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c840: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
c850: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
c860: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c870: 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f    }.      pager_
c880: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
c890: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72     }..    pPager
c8a0: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
c8b0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
c8c0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
c8d0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61  _UNLOCK;.    pPa
c8e0: 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
c8f0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
c900: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c910: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
c920: 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20   when an IOERR, 
c930: 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20  CORRUPT or FULL 
c940: 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76  error.** may hav
c950: 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20  e occurred. The 
c960: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
c970: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
c980: 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72  he pager .** str
c990: 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
c9a0: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
c9b0: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
c9c0: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
c9d0: 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69  r .** API functi
c9e0: 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
c9f0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
ca00: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
ca10: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74  rgument .** to t
ca20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
ca30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
ca40: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
ca50: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
ca60: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
ca70: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
ca80: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
ca90: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
caa0: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
cab0: 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  t error is clear
cac0: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
cad0: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
cae0: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
caf0: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
cb00: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
cb10: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
cb20: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
cb30: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
cb40: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
cb50: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
cb60: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
cb70: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
cb80: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
cb90: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
cba0: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
cbb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
cbc0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
cbd0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
cbe0: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
cbf0: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
cc00: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
cc10: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
cc20: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
cc30: 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
cc40: 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
cc50: 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
cc60: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
cc70: 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
cc80: 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
cc90: 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
cca0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
ccb0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
ccc0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
ccd0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
cce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
ccf0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
cd00: 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
cd10: 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
cd20: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
cd30: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
cd40: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
cd50: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
cd60: 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
cd70: 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
cd80: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
cd90: 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
cda0: 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
cdb0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
cdc0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
cdd0: 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72  de = rc;.  }.  r
cde0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cdf0: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
ce00: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
ce10: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
ce20: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
ce30: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
ce40: 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
ce50: 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
ce60: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
ce70: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
ce80: 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
ce90: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
cea0: 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
ceb0: 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
cec0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
ced0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
cee0: 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
cef0: 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
cf00: 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
cf10: 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
cf20: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c 65  ase file and cle
cf30: 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
cf40: 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e  te. If this mean
cf50: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65 20  s that.** there 
cf60: 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
cf70: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
cf80: 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
cf90: 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  xt connection.**
cfa0: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61   to obtain a sha
cfb0: 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
cfc0: 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79  pager (which may
cfd0: 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77 69   be this one) wi
cfe0: 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61  ll.** roll it ba
cff0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
d000: 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
d010: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
d020: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
d030: 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
d040: 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
d050: 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
d060: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
d070: 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
d080: 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
d090: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
d0a0: 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63 68  ror state. Which
d0b0: 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
d0c0: 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
d0d0: 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
d0e0: 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
d0f0: 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
d100: 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
d110: 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
d120: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d130: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
d140: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
d150: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
d160: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
d170: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
d180: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
d190: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
d1a0: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
d1b0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  r);.    sqlite3E
d1c0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
d1d0: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
d1e0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a  lock(pPager);.}.
d1f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d200: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
d210: 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61  action. A transa
d220: 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79  ction is usually
d230: 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69   ended by .** ei
d240: 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72  ther a COMMIT or
d250: 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72   a ROLLBACK oper
d260: 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74  ation. This rout
d270: 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ine may be calle
d280: 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c  d .** after roll
d290: 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  back of a hot-jo
d2a0: 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20  urnal, or if an 
d2b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
d2c0: 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68  le opening.** th
d2d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d2e0: 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76 65  r writing the ve
d2f0: 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  ry first journal
d300: 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20  -header of a.** 
d310: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
d320: 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  tion..** .** If 
d330: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
d340: 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72 20  PAGER_SHARED or 
d350: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
d360: 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
d370: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d380: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
d390: 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45   (returns SQLITE
d3a0: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  _OK)..**.** Othe
d3b0: 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
d3c0: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
d3d0: 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
d3e0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
d3f0: 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
d400: 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
d410: 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
d420: 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
d430: 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
d440: 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
d450: 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
d460: 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
d470: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
d480: 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
d490: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
d4a0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
d4b0: 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
d4c0: 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
d4d0: 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
d4e0: 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
d4f0: 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
d500: 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
d510: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
d520: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
d530: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
d540: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
d550: 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
d560: 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
d570: 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
d580: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
d590: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
d5a0: 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
d5b0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
d5c0: 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
d5d0: 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
d5e0: 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
d5f0: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
d600: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
d610: 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
d620: 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
d630: 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
d640: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
d650: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
d660: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
d670: 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
d680: 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
d690: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d6a0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
d6b0: 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
d6c0: 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
d6d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
d6e0: 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
d6f0: 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
d700: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
d710: 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
d720: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
d730: 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
d740: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
d750: 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
d760: 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
d770: 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
d780: 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
d790: 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
d7a0: 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
d7b0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
d7c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
d7d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
d7e0: 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
d7f0: 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
d800: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
d810: 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
d820: 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
d830: 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
d840: 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
d850: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
d860: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d870: 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
d880: 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
d890: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
d8a0: 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
d8b0: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
d8c0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
d8d0: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72   finalized, if r
d8e0: 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
d8f0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
d900: 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65 73  e.** pager moves
d910: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
d920: 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77 6e   state (and down
d930: 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b 20  grades the lock 
d940: 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
d950: 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69 6e  se file accordin
d960: 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gly)..**.** If t
d970: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
d980: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
d990: 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e 20   mode and is in 
d9a0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61  PAGER_SYNCED sta
d9b0: 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20  te,.** it moves 
d9c0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
d9d0: 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65  VE. No locks are
d9e0: 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65 6e   downgraded when
d9f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65   running in.** e
da00: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a  xclusive mode..*
da10: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
da20: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
da30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49   error occurs. I
da40: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
da50: 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20  s during.** any 
da60: 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74  of the IO operat
da70: 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65  ions to finalize
da80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
da90: 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a  e or unlock the.
daa0: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e  ** database then
dab0: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
dac0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
dad0: 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74  o the user. If t
dae0: 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  he .** operation
daf0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
db00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
db10: 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ils, then the co
db20: 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65  de still.** trie
db30: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
db40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
db50: 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76   not in exclusiv
db60: 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a  e mode. If the.*
db70: 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  * unlock operati
db80: 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c  on fails as well
db90: 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
dba0: 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61   error code rela
dbb0: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69  ted.** to the fi
dbc0: 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e  rst error encoun
dbd0: 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e  tered (the journ
dbe0: 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20  al finalization 
dbf0: 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72  one) is.** retur
dc00: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
dc10: 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61  nt pager_end_tra
dc20: 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
dc30: 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d  pPager, int hasM
dc40: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
dc50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
dc60: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
dc70: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69   from journal fi
dc80: 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61  nalization opera
dc90: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
dca0: 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  2 = SQLITE_OK;  
dcb0: 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
dcc0: 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e   from db file un
dcd0: 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a  lock operation *
dce0: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  /..  if( pPager-
dcf0: 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
dd00: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
dd10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
dd20: 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53   }.  releaseAllS
dd30: 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
dd40: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  );..  assert( is
dd50: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
dd60: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e  ) || pPager->pIn
dd70: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
dd80: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
dd90: 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61  r->jfd) ){.    a
dda0: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
ddb0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
ddc0: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
ddd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dde0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
ddf0: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
de00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
de10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
de20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
de30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
de40: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
de50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
de60: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
de80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
de90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
dea0: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
deb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
dec0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ded0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
dee0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
def0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
df10: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
df20: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
df30: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
df40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
df50: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
df60: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
df70: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
df80: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
df90: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
dfa0: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
dfb0: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
dfc0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
dfd0: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
dfe0: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
dff0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
e000: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
e010: 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
e020: 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
e030: 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  er);.      pager
e040: 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
e050: 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  c);.      pPager
e060: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
e070: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
e080: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
e090: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
e0a0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
e0b0: 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
e0c0: 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
e0d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
e0e0: 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
e0f0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
e100: 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
e110: 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
e120: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
e130: 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
e140: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
e150: 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
e160: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
e170: 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
e180: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
e190: 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
e1a0: 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
e1b0: 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  y journal. .    
e1c0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
e1d0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
e1e0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
e1f0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
e200: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
e210: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
e220: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
e230: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
e240: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
e250: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
e260: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
e270: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
e280: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
e290: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
e2a0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
e2b0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
e2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e2d0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
e2e0: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
e2f0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
e300: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
e310: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
e320: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
e330: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
e340: 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
e350: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
e360: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
e370: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
e380: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
e390: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
e3a0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
e3b0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
e3c0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
e3d0: 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  c = 0;.  sqlite3
e3e0: 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
e3f0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
e400: 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
e410: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
e420: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
e430: 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
e440: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
e450: 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
e460: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
e470: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
e480: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
e490: 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ARED;..    /* If
e4a0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
e4b0: 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  was in locking_m
e4c0: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
e4d0: 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
e4e0: 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72 6f 70  ger,.    ** drop
e4f0: 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
e500: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
e510: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
e520: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
e530: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
e540: 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
e550: 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
e560: 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29  pPager->pWal, 0)
e570: 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20 3d 20   ){.      rc2 = 
e580: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
e590: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
e5a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
e5b0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
e5c0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
e5d0: 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63     rc2 = osUnloc
e5e0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
e5f0: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
e600: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
e610: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
e620: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
e630: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
e640: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
e650: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
e660: 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50  SYNCED ){.    pP
e670: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
e680: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
e690: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
e6a0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
e6b0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
e6c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   0;.  pPager->db
e6d0: 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20  Modified = 0;.. 
e6e0: 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68 69   /* TODO: Is thi
e6f0: 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20 69  s optimal? Why i
e700: 73 20 74 68 65 20 64 62 20 73 69 7a 65 20 69 6e  s the db size in
e710: 76 61 6c 69 64 61 74 65 64 20 68 65 72 65 20 0a  validated here .
e720: 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64 61    ** when the da
e730: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
e740: 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a  ot unlocked? */.
e750: 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
e760: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Size = 0;.  sqli
e770: 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74  te3PcacheTruncat
e780: 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
e790: 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e, pPager->dbSiz
e7a0: 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  e);.  if( !MEMDB
e7b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
e7c0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
e7d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
e7e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
e7f0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
e800: 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20  Parameter aData 
e810: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
e820: 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72  buffer of pPager
e830: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
e840: 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d  .** of data. Com
e850: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
e860: 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64  a checksum based
e870: 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   ont the content
e880: 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  s of the .** pag
e890: 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68  e of data and th
e8a0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
e8b0: 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of pPager->cksum
e8c0: 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Init..**.** This
e8d0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
e8e0: 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72  hecksum. It is r
e8f0: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
e900: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
e910: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
e920: 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  ue (pPager->cksu
e930: 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79  mInit) and every
e940: 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f   200th byte.** o
e950: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c  f the page data,
e960: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62   starting with b
e970: 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67  yte offset (pPag
e980: 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30  er->pageSize%200
e990: 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20  )..** Each byte 
e9a0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
e9b0: 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67  s an 8-bit unsig
e9c0: 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  ned integer..**.
e9d0: 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  ** Changing the 
e9e0: 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20  formula used to 
e9f0: 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65  compute this che
ea00: 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e  cksum results in
ea10: 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69   an.** incompati
ea20: 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ble journal file
ea30: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
ea40: 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  f journal corrup
ea50: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
ea60: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
ea70: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
ea80: 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f  ely .** scenario
ea90: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
eaa0: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
eab0: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
eac0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a   be changed. .**
ead0: 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73   It is much less
eae0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
eaf0: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
eb00: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
eb10: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
eb20: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
eb30: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
eb40: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
eb50: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
eb60: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
eb70: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
eb80: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
eb90: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
eba0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
ebb0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
ebc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
ebd0: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
ebe0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
ebf0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ec00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ;         /* Che
ec10: 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72  cksum value to r
ec20: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
ec30: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
ec40: 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20  ize-200;        
ec50: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ec60: 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e  r */.  while( i>
ec70: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
ec80: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
ec90: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
eca0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
ecb0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
ecc0: 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65  ngle page from e
ecd0: 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  ither the journa
ece0: 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69  l file (if isMai
ecf0: 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20  nJrnl==1) or.** 
ed00: 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
ed10: 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a  rnal (if isMainJ
ed20: 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79  rnl==0) and play
ed30: 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a  back that page..
ed40: 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69  ** The page begi
ed50: 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f  ns at offset *pO
ed60: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
ed70: 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65  ile. The *pOffse
ed80: 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e  t.** value is in
ed90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73  creased to the s
eda0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
edb0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
edc0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
edd0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20  isMainJrnl flag 
ede0: 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73 20  is true if this 
edf0: 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  is the main roll
ee00: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
ee10: 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68  .** false for th
ee20: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
ee30: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72  nal.  The main r
ee40: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
ee50: 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d  uses.** checksum
ee60: 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e  s - the statemen
ee70: 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  t journal does n
ee80: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
ee90: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
eea0: 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
eeb0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
eec0: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
eed0: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
eee0: 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
eef0: 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
ef00: 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
ef10: 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
ef20: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
ef30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
ef40: 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
ef50: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
ef60: 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
ef70: 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
ef80: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
ef90: 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
efa0: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
efb0: 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
efc0: 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
efd0: 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
efe0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
eff0: 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
f000: 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
f010: 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
f020: 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
f030: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
f040: 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
f050: 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
f060: 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
f070: 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
f080: 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
f090: 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
f0a0: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
f0b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
f0c0: 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
f0d0: 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
f0e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
f0f0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
f100: 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
f110: 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
f120: 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
f130: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
f140: 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
f150: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
f160: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
f170: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
f180: 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
f190: 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
f1a0: 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
f1b0: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
f1c0: 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
f1d0: 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
f1e0: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
f1f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
f200: 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
f210: 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
f220: 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
f230: 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
f240: 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
f250: 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
f260: 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
f270: 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
f280: 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
f290: 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
f2a0: 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
f2b0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
f2c0: 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
f2d0: 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
f2e0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
f2f0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
f300: 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
f310: 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
f320: 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
f330: 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
f340: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
f350: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
f360: 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
f370: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
f380: 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
f390: 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
f3a0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
f3b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
f3c0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
f3d0: 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
f3e0: 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
f3f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
f400: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
f410: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
f420: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
f430: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
f460: 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
f470: 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
f480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f490: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
f4a0: 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
f4b0: 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
f4c0: 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
f4d0: 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
f4e0: 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
f4f0: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
f500: 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f520: 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
f530: 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
f540: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
f550: 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
f560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
f570: 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
f580: 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
f590: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
f5a0: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
f5b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
f5c0: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
f5d0: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
f5e0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f600: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
f610: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
f620: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
f630: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
f640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
f650: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
f660: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
f670: 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
f680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f690: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
f6a0: 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
f6b0: 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
f6c0: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
f6d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
f6e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
f6f0: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
f700: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
f710: 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
f720: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
f730: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
f740: 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
f750: 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
f760: 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
f770: 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
f780: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
f790: 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
f7a0: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
f7b0: 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
f7c0: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
f7d0: 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
f7e0: 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
f7f0: 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
f800: 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
f810: 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
f820: 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
f830: 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
f840: 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
f850: 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
f860: 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
f870: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
f880: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
f890: 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
f8a0: 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
f8b0: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
f8c0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
f8d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
f8e0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
f8f0: 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
f900: 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
f910: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   );..  /* Read t
f920: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
f930: 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
f940: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
f950: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
f960: 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
f970: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
f980: 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
f990: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f9a0: 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
f9b0: 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
f9c0: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
f9d0: 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
f9e0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
f9f0: 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
fa00: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
fa10: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
fa20: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
fa30: 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a  OsRead(jfd, (u8*
fa40: 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
fa50: 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66  pageSize, (*pOff
fa60: 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72  set)+4);.  if( r
fa70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
fa80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66  eturn rc;.  *pOf
fa90: 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e  fset += pPager->
faa0: 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69  pageSize + 4 + i
fab0: 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20  sMainJrnl*4;..  
fac0: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
fad0: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
fae0: 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
faf0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
fb00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
fb10: 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
fb20: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
fb30: 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
fb40: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
fb50: 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
fb60: 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
fb70: 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
fb80: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
fb90: 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
fba0: 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
fbb0: 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
fbc0: 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
fbd0: 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
fbe0: 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
fbf0: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
fc00: 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
fc10: 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
fc20: 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76    assert( !isSav
fc30: 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75  epnt );.    retu
fc40: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fc50: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
fc60: 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
fc70: 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  ize || sqlite3Bi
fc80: 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20  tvecTest(pDone, 
fc90: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74  pgno) ){.    ret
fca0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
fcb0: 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a   }.  if( isMainJ
fcc0: 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  rnl ){.    rc = 
fcd0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
fce0: 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63  (*pOffset)-4, &c
fcf0: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
fd00: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
fd10: 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e     if( !isSavepn
fd20: 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d  t && pager_cksum
fd30: 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44  (pPager, (u8*)aD
fd40: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
fd50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fd60: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
fd70: 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   }..  if( pDone 
fd80: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
fd90: 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
fda0: 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
fdb0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
fdc0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
fdd0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
fde0: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
fdf0: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
fe00: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
fe10: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
fe20: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
fe30: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
fe40: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
fe50: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
fe60: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
fe70: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
fe80: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
fe90: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
fea0: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
feb0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
fec0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
fed0: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
fee0: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
fef0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
ff00: 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
ff10: 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
ff20: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
ff30: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
ff40: 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
ff50: 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
ff60: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
ff70: 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
ff80: 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
ff90: 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
ffa0: 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
ffb0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
ffc0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
ffd0: 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
ffe0: 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
fff0: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
10000 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
10010 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
10020 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
10030 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
10040 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
10050 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
10060 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
10070 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
10080 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
10090 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
100a0 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
100b0 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
100c0 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
100d0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
100e0 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
100f0 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
10100 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
10110 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
10120 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
10130 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
10140 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
10150 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
10160 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
10170 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10180 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
10190 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
101a0 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
101b0 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
101c0 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
101d0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
101e0 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
101f0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
10200 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
10210 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
10220 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
10230 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
10240 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
10250 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
10260 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
10270 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
10280 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
10290 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
102a0 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
102b0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
102c0 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
102d0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
102e0 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
102f0 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
10300 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
10310 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
10320 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
10330 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
10340 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
10350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
10360 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
10370 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
10380 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
10390 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
103a0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
103b0 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
103c0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
103d0 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
103e0 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
103f0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
10400 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
10410 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
10420 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
10430 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
10440 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
10450 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
10460 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
10470 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
10480 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
10490 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
104a0 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
104b0 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
104c0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
104d0 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
104e0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
104f0 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
10500 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
10510 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
10520 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
10530 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
10540 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
10550 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
10560 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
10570 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
10580 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
10590 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
105a0 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61  se{.    pPg = pa
105b0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
105c0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
105d0 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
105e0 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45 52  MEMDB );.  PAGER
105f0 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
10600 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
10610 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
10620 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
10630 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
10640 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
10650 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
10660 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
10670 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
10680 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
10690 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
106a0 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
106b0 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
106c0 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
106d0 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
106e0 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
106f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
10700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
10710 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
10720 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
10730 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
10740 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
10750 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
10760 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
10770 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28 70  ).   && isOpen(p
10780 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26  Pager->fd).   &&
10790 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
107a0 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
107b0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
107c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
107d0 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
107e0 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
107f0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
10800 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
10810 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
10820 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
10830 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
10840 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10850 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
10860 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
10870 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
10880 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  t);.    if( pgno
10890 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
108a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
108b0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
108c0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
108d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
108e0 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43  ackup ){.      C
108f0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
10900 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
10910 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
10920 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
10930 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
10940 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
10950 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
10960 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
10970 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
10980 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
10990 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  EM, aData);.    
109a0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69  }.  }else if( !i
109b0 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67  sMainJrnl && pPg
109c0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
109d0 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
109e0 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69  ack of a savepoi
109f0 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20  nt and data was 
10a00 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  not written to. 
10a10 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
10a20 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  se and the page 
10a30 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79  is not in-memory
10a40 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74  , there is a pot
10a50 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72  ential.    ** pr
10a60 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20  oblem. When the 
10a70 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74  page is next fet
10a80 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72  ched by the b-tr
10a90 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20  ee layer, it .  
10aa0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61    ** will be rea
10ab0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
10ac0 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
10ad0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
10ae0 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  e .    ** curren
10af0 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t. .    **.    *
10b00 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f  * There are a co
10b10 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e  uple of differen
10b20 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20  t ways this can 
10b30 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20  happen. All are 
10b40 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73  quite.    ** obs
10b50 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69  cure. When runni
10b60 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75  ng in synchronou
10b70 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e  s mode, this can
10b80 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20   only happen .  
10b90 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
10ba0 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d   is on the free-
10bb0 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72  list at the star
10bc0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
10bd0 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  tion, then.    *
10be0 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65  * populated, the
10bf0 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71  n moved using sq
10c00 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
10c10 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ge()..    **.   
10c20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e   ** The solution
10c30 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e   is to add an in
10c40 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20  -memory page to 
10c50 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
10c60 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ning.    ** the 
10c70 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66  data just read f
10c80 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
10c90 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61  nal. Mark the pa
10ca0 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20  ge as dirty .   
10cb0 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70   ** and if the p
10cc0 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20  ager requires a 
10cd0 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68  journal-sync, th
10ce0 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  en mark the page
10cf0 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75   as .    ** requ
10d00 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d  iring a journal-
10d10 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69  sync before it i
10d20 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  s written..    *
10d30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  /.    assert( is
10d40 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61  Savepnt );.    a
10d50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
10d60 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  oNotSpill==0 );.
10d70 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
10d80 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63  tSpill++;.    rc
10d90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
10da0 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70  cquire(pPager, p
10db0 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  gno, &pPg, 1);. 
10dc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10dd0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31  r->doNotSpill==1
10de0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
10df0 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20  doNotSpill--;.  
10e00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10e10 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
10e20 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
10e30 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
10e40 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
10e50 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
10e60 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
10e70 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
10e80 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
10e90 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
10ea0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
10eb0 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
10ec0 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
10ed0 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
10ee0 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
10ef0 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
10f00 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
10f10 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
10f20 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
10f30 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
10f40 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
10f50 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
10f60 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
10f70 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
10f80 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
10f90 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
10fa0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
10fb0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
10fc0 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
10fd0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
10fe0 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
10ff0 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
11000 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
11010 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
11020 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
11030 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
11040 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
11050 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
11060 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
11070 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
11080 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
11090 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
110a0 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
110b0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
110c0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
110d0 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
110e0 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
110f0 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
11100 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
11110 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
11120 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
11130 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
11140 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
11150 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
11160 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
11170 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
11180 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
11190 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
111a0 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  abase..      **.
111b0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
111c0 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
111d0 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
111e0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
111f0 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
11200 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
11210 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
11220 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
11230 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
11240 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
11250 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
11260 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
11270 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
11280 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
11290 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
112a0 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
112b0 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
112c0 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
112d0 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
112e0 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
112f0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
11300 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
11310 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
11320 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
11330 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
11340 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
11350 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
11360 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
11370 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
11380 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
11390 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
113a0 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
113b0 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
113c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
113d0 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
113e0 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
113f0 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
11400 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
11410 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
11420 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
11430 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
11440 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
11450 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
11460 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
11470 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
11480 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
11490 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
114a0 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
114b0 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
114c0 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
114d0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
114e0 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
114f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11500 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
11510 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
11520 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
11530 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
11540 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
11550 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
11560 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
11570 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
11580 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
11590 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
115a0 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
115b0 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
115c0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
115d0 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
115e0 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
115f0 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
11600 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
11610 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
11620 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
11630 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
11640 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
11650 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
11660 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
11670 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
11680 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
11690 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
116a0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
116b0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
116c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
116d0 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  M);.    sqlite3P
116e0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
116f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11700 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
11710 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
11720 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
11730 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11740 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
11750 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
11760 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
11770 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11780 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
11790 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
117a0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
117b0 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
117c0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
117d0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
117e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
117f0 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
11800 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
11810 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
11820 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
11830 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
11840 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
11850 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
11860 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
11870 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
11880 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65  .** When a maste
11890 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
118a0 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73  s created, it is
118b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
118c0 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
118d0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
118e0 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20  d journals, one 
118f0 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66  after another, f
11900 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d  ormatted as utf-
11910 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65  8 .** encoded te
11920 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65  xt. The end of e
11930 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
11940 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64  l file is marked
11950 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d   with a .** nul-
11960 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
11970 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65  (0x00). i.e. the
11980 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
11990 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
119a0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  rnal.** file for
119b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
119c0 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74  nvolving two dat
119d0 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a  abases might be:
119e0 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f  .**.**   "/home/
119f0 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61  bill/a.db-journa
11a00 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  l\x00/home/bill/
11a10 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  b.db-journal\x00
11a20 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72  ".**.** A master
11a30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
11a40 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65  y only be delete
11a50 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74  d once all of it
11a60 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72  s child .** jour
11a70 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72  nals have been r
11a80 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
11a90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11aa0 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e  reads the conten
11ab0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
11ac0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e  -journal file in
11ad0 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  to .** memory an
11ae0 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  d loops through 
11af0 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c  each of the chil
11b00 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e  d journal names.
11b10 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   For.** each chi
11b20 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63  ld journal, it c
11b30 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  hecks if:.**.** 
11b40 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
11b50 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c   journal exists,
11b60 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20   and if so.**   
11b70 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
11b80 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
11b90 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d  a reference to m
11ba0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a  aster journal .*
11bb0 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74  *     file zMast
11bc0 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68  er.**.** If a ch
11bd0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
11be0 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61  be found that ma
11bf0 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68  tches both of th
11c00 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62  e criteria.** ab
11c10 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ove, this functi
11c20 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  on returns witho
11c30 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
11c40 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  g. Otherwise, if
11c50 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c  .** no such chil
11c60 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
11c70 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61   found, file zMa
11c80 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20  ster is deleted 
11c90 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65  from.** the file
11ca0 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71  -system using sq
11cb0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
11cc0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
11cd0 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69  error within thi
11ce0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65  s function, an e
11cf0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
11d00 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  urned. This.** f
11d10 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
11d20 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  s memory by call
11d30 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ing sqlite3Mallo
11d40 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63  c(). If an alloc
11d50 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20  ation.** fails, 
11d60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
11d70 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
11d80 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72  ise, if no IO or
11d90 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a   malloc errors .
11da0 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  ** occur, SQLITE
11db0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11dc0 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
11dd0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
11de0 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  ates a single bl
11df0 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
11e00 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74   load.** the ent
11e10 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11e20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11e30 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
11e40 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70  uld be.** a coup
11e50 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20  le of kilobytes 
11e60 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61  or so - potentia
11e70 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lly larger than 
11e80 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a  the page .** siz
11e90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11ea0 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
11eb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11ec0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
11ed0 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
11ee0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
11ef0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
11f00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11f10 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11f20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
11f30 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
11f40 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
11f50 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
11f60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
11f70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
11f80 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a   *pJournal;   /*
11f90 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d   Malloc'd child-
11fa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
11fb0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61  criptor */.  cha
11fc0 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
11fd0 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
11fe0 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
11ff0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
12000 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
12010 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
12020 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
12030 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
12040 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
12050 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
12060 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c  r to one journal
12070 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20   within MJ file 
12080 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
12090 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f  erPtr;         /
120a0 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
120b0 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d  MJ filename from
120c0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
120d0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
120e0 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Ptr;           /
120f0 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  * Amount of spac
12100 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a  e allocated to z
12110 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a  MasterPtr[] */..
12120 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
12130 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65  ace for both the
12140 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d   pJournal and pM
12150 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72  aster file descr
12160 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20  iptors..  ** If 
12170 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e  successful, open
12180 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
12190 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61  nal file for rea
121a0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ding..  */.  pMa
121b0 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
121c0 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
121d0 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73  llocZero(pVfs->s
121e0 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
121f0 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
12200 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
12210 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
12220 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
12230 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
12240 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12250 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
12260 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
12270 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
12280 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
12290 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
122a0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
122b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
122c0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
122d0 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
122e0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
122f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
12300 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12310 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
12320 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
12330 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
12340 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
12350 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
12360 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
12370 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
12380 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
12390 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
123a0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
123b0 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
123c0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
123d0 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
123e0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
123f0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
12400 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
12410 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
12420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12430 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
12440 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
12450 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12460 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
12470 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
12480 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
12490 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
124a0 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
124b0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
124c0 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
124d0 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
124e0 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
124f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
12500 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12510 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
12520 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
12530 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
12540 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
12550 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
12560 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
12570 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
12580 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
12590 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
125a0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
125b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
125c0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
125d0 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
125e0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
125f0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
12600 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
12610 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
12620 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
12630 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
12640 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
12650 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
12660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12670 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
12680 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
12690 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
126a0 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
126b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
126c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
126d0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
126e0 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
126f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
12700 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
12710 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
12720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12730 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
12740 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
12750 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
12760 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
12770 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
12780 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
12790 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
127a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
127b0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
127c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
127d0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
127e0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
127f0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
12800 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
12810 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12820 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
12830 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
12840 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
12850 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12860 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12870 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
12880 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
12890 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
128a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
128b0 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
128c0 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
128d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
128e0 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
128f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12910 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
12920 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
12930 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
12940 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
12950 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
12960 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
12970 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
12980 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
12990 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
129a0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
129b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
129c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
129d0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
129e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
129f0 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
12a00 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12a10 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
12a20 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
12a30 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
12a40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
12a50 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
12a60 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
12a70 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
12a80 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
12a90 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
12aa0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
12ab0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
12ac0 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
12ad0 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
12ae0 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
12af0 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
12b00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12b10 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
12b20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
12b30 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
12b40 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
12b50 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
12b60 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
12b70 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
12b80 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
12b90 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
12ba0 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
12bb0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
12bc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
12bd0 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
12be0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
12bf0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
12c00 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
12c10 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
12c20 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
12c30 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a 20   lock is not.** 
12c40 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74  held, this funct
12c50 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
12c60 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
12c70 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
12c80 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  is.** changed to
12c90 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50   nPage pages (nP
12ca0 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  age*pPager->page
12cb0 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66 20  Size bytes). If 
12cc0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20 64  the file.** on d
12cd0 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
12ce0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
12cf0 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
12d00 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
12d10 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
12d20 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
12d30 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
12d40 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
12d50 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
12d60 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
12d70 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
12d80 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
12d90 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
12da0 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
12db0 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
12dc0 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
12dd0 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
12de0 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
12df0 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
12e00 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
12e10 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
12e20 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
12e30 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
12e40 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
12e50 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
12e60 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
12e70 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
12e80 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
12e90 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
12ea0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
12eb0 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
12ec0 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
12ed0 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
12ee0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
12ef0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
12f00 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
12f10 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
12f20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
12f30 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
12f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12f50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
12f60 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
12f70 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
12f80 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69 36  r->fd) ){.    i6
12f90 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
12fa0 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20 54  ewSize;.    /* T
12fb0 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
12fc0 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
12fd0 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
12fe0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12ff0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
13000 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
13010 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
13020 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
13030 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
13040 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13050 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
13060 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
13070 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
13080 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
13090 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
130a0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
130b0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
130c0 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
130d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
130e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
130f0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22  e(pPager->fd, ""
13100 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b  , 1, newSize-1);
13110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13120 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13130 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
13140 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
13150 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
13160 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
13170 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13180 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
13190 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
131a0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
131b0 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
131c0 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
131d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
131e0 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
131f0 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
13200 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
13210 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
13220 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
13230 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
13240 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
13250 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
13260 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
13270 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
13280 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
13290 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
132a0 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
132b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
132c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
132d0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
132e0 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
132f0 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
13300 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
13310 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
13320 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
13330 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
13340 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
13350 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
13360 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
13370 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
13380 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
13390 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
133a0 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
133b0 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
133c0 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
133d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
133e0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
133f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
13400 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
13410 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
13420 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
13430 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
13440 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
13450 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
13460 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f  empFile ){.    /
13470 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
13480 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
13490 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
134a0 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
134b0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
134c0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
134d0 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
134e0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
134f0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
13500 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
13510 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
13520 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
13530 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
13540 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
13550 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
13560 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
13570 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  32 ){.    pPager
13580 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
13590 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  12;.  }.  if( pP
135a0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
135b0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
135c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
135d0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
135e0 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67  =512 );.    pPag
135f0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
13600 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
13610 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
13620 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
13630 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
13640 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
13650 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
13660 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
13670 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
13680 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
13690 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
136a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
136b0 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
136c0 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
136d0 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
136e0 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
136f0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
13700 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
13710 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
13720 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
13730 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
13740 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
13750 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
13760 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
13770 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
13780 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
13790 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
137a0 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
137b0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
137c0 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
137d0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
137e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
137f0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
13800 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
13810 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
13820 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
13830 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
13840 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
13850 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
13860 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
13870 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
13880 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
13890 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
138a0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
138b0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
138c0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
138d0 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
138e0 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
138f0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
13900 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
13910 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
13920 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
13930 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
13940 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
13950 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
13960 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
13970 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
13980 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
13990 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
139a0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
139b0 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
139c0 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
139d0 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
139e0 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
139f0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
13a00 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
13a10 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
13a20 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
13a30 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
13a40 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
13a50 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
13a60 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
13a70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
13a80 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
13a90 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
13aa0 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
13ab0 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
13ac0 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
13ad0 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
13ae0 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
13af0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
13b00 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
13b10 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
13b20 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
13b30 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
13b40 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
13b50 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13b60 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
13b70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
13b80 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
13b90 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
13ba0 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
13bb0 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
13bc0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
13bd0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
13be0 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
13bf0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
13c00 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
13c10 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
13c20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
13c30 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
13c40 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
13c50 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
13c60 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
13c70 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
13c80 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
13c90 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
13ca0 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
13cb0 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
13cc0 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
13cd0 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
13ce0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
13cf0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
13d00 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
13d10 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
13d20 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
13d30 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
13d40 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
13d50 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
13d60 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
13d70 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
13d80 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
13d90 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
13da0 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
13db0 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
13dc0 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
13dd0 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
13de0 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
13df0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
13e00 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
13e10 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
13e20 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
13e30 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
13e40 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
13e50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13e60 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
13e70 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
13e80 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
13e90 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
13ea0 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
13eb0 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
13ec0 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
13ed0 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
13ee0 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
13ef0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
13f00 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
13f10 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
13f20 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
13f30 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
13f40 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
13f50 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
13f60 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
13f70 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
13f80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
13f90 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
13fa0 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
13fb0 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
13fc0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
13fd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
13fe0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
13ff0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
14000 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
14010 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
14020 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
14030 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
14040 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
14050 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
14060 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
14070 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
14080 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
14090 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
140a0 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
140b0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
140c0 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
140d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
140e0 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
140f0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
14100 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
14110 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
14120 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
14130 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
14140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
14150 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
14160 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
14170 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
14180 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
14190 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
141a0 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
141b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
141c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
141d0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
141e0 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
141f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14200 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
14210 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
14220 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
14230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
14240 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
14250 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
14260 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
14270 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
14280 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
14290 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
142a0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
142b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
142c0 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
142d0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
142e0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
142f0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
14300 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
14310 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
14320 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
14330 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
14340 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
14350 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
14360 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
14370 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
14380 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
14390 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
143a0 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
143b0 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
143c0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
143d0 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
143e0 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
143f0 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
14400 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
14410 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
14420 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
14430 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
14440 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
14450 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
14460 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
14470 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
14480 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
14490 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
144a0 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
144b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
144c0 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
144d0 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
144e0 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
144f0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
14500 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
14510 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
14520 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
14530 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
14540 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
14550 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
14560 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
14570 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
14580 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
14590 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
145a0 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
145b0 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
145c0 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
145d0 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
145e0 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
145f0 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
14600 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
14610 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
14620 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
14630 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
14640 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
14650 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
14660 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20  s_unix.c,.  **  
14670 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31  mxPathname is 51
14680 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  2, which is the 
14690 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69  same as the mini
146a0 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61  mum allowable va
146b0 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67  lue.  ** for pag
146c0 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d  eSize..  */.  zM
146d0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
146e0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
146f0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
14700 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
14710 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
14720 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
14730 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
14740 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
14750 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
14760 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
14770 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
14780 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
14790 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
147a0 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
147b0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
147c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
147d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
147e0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
147f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14800 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61  ff = 0;.  needPa
14810 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74  gerReset = isHot
14820 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
14830 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
14840 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a  her when a readJ
14850 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a  ournalHdr() or .
14860 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
14870 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63  ack_one_page() c
14880 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49  all returns SQLI
14890 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
148a0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63   error .  ** occ
148b0 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69  urs. .  */.  whi
148c0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20  le( 1 ){.    /* 
148d0 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
148e0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
148f0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
14900 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
14910 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
14920 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
14930 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14940 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
14950 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
14960 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
14970 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
14980 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
14990 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
149a0 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
149b0 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
149c0 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
149d0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
149e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
149f0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
14a00 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73  pPager, isHot, s
14a10 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
14a20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14a30 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
14a40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14a50 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14a60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
14a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14a80 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
14a90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
14aa0 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
14ab0 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
14ac0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
14ad0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
14ae0 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
14af0 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
14b00 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
14b10 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
14b20 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
14b30 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
14b40 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
14b50 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
14b60 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
14b70 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
14b80 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
14b90 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
14ba0 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
14bb0 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
14bc0 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
14bd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14be0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
14bf0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
14c00 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
14c10 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
14c20 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
14c30 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
14c40 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
14c50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
14c60 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20  f nRec is 0 and 
14c70 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73  this rollback is
14c80 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
14c90 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69  n created by thi
14ca0 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  s.    ** process
14cb0 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20   and if this is 
14cc0 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72  the final header
14cd0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   in the journal,
14ce0 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20   then it means. 
14cf0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20     ** that this 
14d00 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  part of the jour
14d10 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69  nal was being fi
14d20 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74  lled but has not
14d30 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a   yet been.    **
14d40 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
14d50 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75    Compute the nu
14d60 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61  mber of pages ba
14d70 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69  sed on the remai
14d80 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65  ning.    ** size
14d90 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   of the file..  
14da0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
14db0 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68  third term of th
14dc0 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64  e test was added
14dd0 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23   to fix ticket #
14de0 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65  2565..    ** Whe
14df0 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
14e00 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52   hot journal, nR
14e10 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61  ec==0 always mea
14e20 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ns that the next
14e30 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66  .    ** chunk of
14e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e   the journal con
14e50 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73  tains zero pages
14e60 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
14e70 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  ck.  But.    ** 
14e80 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c  when doing a ROL
14e90 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52  LBACK and the nR
14ea0 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74  ec==0 chunk is t
14eb0 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e  he last chunk in
14ec0 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
14ed0 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  nal, it means th
14ee0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  at the journal m
14ef0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64  ight contain add
14f00 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70  itional.    ** p
14f10 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
14f20 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
14f30 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75   and that the nu
14f40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20  mber of pages . 
14f50 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20     ** should be 
14f60 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f  computed based o
14f70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14f80 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  le size..    */.
14f90 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
14fa0 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
14fb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
14fc0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
14fd0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
14fe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14ff0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
15000 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
15010 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15020 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
15030 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
15040 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
15050 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
15060 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
15070 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
15080 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
15090 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
150a0 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
150b0 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
150c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
150d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
150e0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
150f0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
15100 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
15110 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
15120 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15130 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15140 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
15150 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
15160 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
15170 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
15180 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
15190 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
151a0 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
151b0 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
151c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  the .    ** data
151d0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72  base file and/or
151e0 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20   page cache..   
151f0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
15200 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
15210 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61 67       if( needPag
15220 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  erReset ){.     
15230 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
15240 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
15250 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
15260 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
15270 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
15280 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
15290 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a  Pager,&pPager->j
152a0 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29  ournalOff,0,1,0)
152b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
152c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
152d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
152e0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
152f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15300 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
15310 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15320 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
15330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15340 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
15350 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
15360 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
15370 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
15380 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
15390 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70   truncated, simp
153a0 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  ly stop reading 
153b0 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
153c0 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20   processing the 
153d0 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69  journal. This mi
153e0 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68  ght happen if th
153f0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  e journal was.  
15400 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63          ** not c
15410 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65  ompletely writte
15420 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69  n and synced pri
15430 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20  or to a crash.  
15440 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  In that.        
15450 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64    ** case, the d
15460 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68  atabase should h
15470 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77  ave never been w
15480 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20  ritten in the.  
15490 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74          ** first
154a0 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20   place so it is 
154b0 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61  OK to simply aba
154c0 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  ndon the rollbac
154d0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  k. */.          
154e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
154f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
15500 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
15510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15520 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
15530 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
15540 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20  lback, quit and 
15550 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
15560 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
15570 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63  de.  This will c
15580 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74  ause the pager t
15590 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  o enter the erro
155a0 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20  r state.        
155b0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20    ** so that no 
155c0 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c  further harm wil
155d0 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68  l be done.  Perh
155e0 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20  aps the next.   
155f0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
15600 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
15610 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20  will be able to 
15620 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74  rollback the dat
15630 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20  abase..         
15640 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
15650 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
15660 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15670 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
15680 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20  *NOTREACHED*/.  
15690 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e  assert( 0 );..en
156a0 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a  d_playback:.  /*
156b0 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c   Following a rol
156c0 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62  lback, the datab
156d0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
156e0 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f  be back in its o
156f0 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61  riginal.  ** sta
15700 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  te prior to the 
15710 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
15720 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76  nsaction, so inv
15730 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  oke the.  ** SQL
15740 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
15750 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74  HANGED file-cont
15760 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69  rol method to di
15770 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61  sable the.  ** a
15780 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68  ssertion that th
15790 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
157a0 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69  unter was modifi
157b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
157c0 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  t(.    pPager->f
157d0 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c  d->pMethods==0 |
157e0 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  |.    sqlite3OsF
157f0 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
15800 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e  r->fd,SQLITE_FCN
15810 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c  TL_DB_UNCHANGED,
15820 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  0)>=SQLITE_OK.  
15830 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
15840 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70   playback is hap
15850 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63  pening automatic
15860 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74  ally as a result
15870 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20   of an IO or .  
15880 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
15890 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66  that occurred af
158a0 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ter the change-c
158b0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
158c0 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66  ed but .  ** bef
158d0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
158e0 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ion was committe
158f0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e  d, then the chan
15900 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a  ge-counter .  **
15910 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61   modification ma
15920 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e  y just have been
15930 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68   reverted. If th
15940 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78  is happens in ex
15950 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f  clusive .  ** mo
15960 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  de, then subsequ
15970 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent transactions
15980 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
15990 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
159a0 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74  l not.  ** updat
159b0 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
159c0 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69  nter at all. Thi
159d0 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61  s may lead to ca
159e0 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63  che inconsistenc
159f0 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20  y.  ** problems 
15a00 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73  for other proces
15a10 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  ses at some poin
15a20 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
15a30 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69   So, just.  ** i
15a40 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20  n case this has 
15a50 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20  happened, clear 
15a60 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
15a70 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20  one flag now..  
15a80 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  */.  pPager->cha
15a90 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
15aa0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
15ab0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
15ad0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
15ae0 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
15af0 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
15b00 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
15b10 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
15b20 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
15b30 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74  ame+1);.    test
15b40 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15b50 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
15b60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15b70 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
15b80 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ==0 && pPager->s
15b90 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
15ba0 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
15bb0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
15bc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
15bd0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
15be0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
15bf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
15c00 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
15c10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15c20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
15c30 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15c40 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
15c50 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
15c60 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
15c70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15c80 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
15c90 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
15ca0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
15cb0 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
15cc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
15cd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
15ce0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
15cf0 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
15d00 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
15d10 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
15d20 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
15d30 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
15d40 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
15d50 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
15d60 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
15d70 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
15d80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
15d90 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
15da0 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
15db0 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
15dc0 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
15dd0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
15de0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
15df0 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
15e00 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
15e10 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
15e20 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
15e30 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
15e40 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
15e50 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
15e60 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
15e70 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
15e80 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
15e90 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
15ea0 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
15eb0 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
15ec0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
15ed0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15ee0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  .../*.** Read th
15ef0 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61  e content for pa
15f00 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
15f10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15f20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67  and into .** pPg
15f30 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65  ->pData. A share
15f40 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  d lock or greate
15f50 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  r must be held o
15f60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
15f70 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
15f80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15f90 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
15fa0 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20  page 1 is read, 
15fb0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  then the value o
15fc0 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
15fd0 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a  rs[] is set to.*
15fe0 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  * the value read
15ff0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
16000 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
16010 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
16020 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49  curs, then the I
16030 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  O error is retur
16040 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
16050 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  r..** Otherwise,
16060 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16070 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
16080 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
16090 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
160a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
160b0 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20  pPg->pPager; /* 
160c0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73  Pager object ass
160d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
160e0 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  e pPg */.  Pgno 
160f0 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
16100 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20  ;       /* Page 
16110 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a  number to read *
16120 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
16130 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
16140 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
16150 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61 6c  */.  int isInWal
16160 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16170 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61 67    /* True if pag
16180 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65  e is in log file
16190 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
161a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
161b0 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
161c0 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
161d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
161e0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
161f0 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44  _SHARED && !MEMD
16200 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  B );.  assert( i
16210 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
16220 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  ) );..  if( NEVE
16230 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  R(!isOpen(pPager
16240 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73  ->fd)) ){.    as
16250 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
16260 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65  mpFile );.    me
16270 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
16280 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
16290 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Size);.    retur
162a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
162b0 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
162c0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
162d0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
162e0 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
162f0 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
16300 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
16310 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28   sqlite3WalRead(
16320 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
16330 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67  no, &isInWal, pg
16340 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  sz, pPg->pData);
16350 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
16360 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49  QLITE_OK && !isI
16370 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20  nWal ){.    i64 
16380 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
16390 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
163a0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
163b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
163c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
163d0 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
163e0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
163f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
16400 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
16410 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16420 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
16430 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
16440 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
16450 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
16460 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
16470 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
16480 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
16490 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
164a0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
164b0 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
164c0 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
164d0 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
164e0 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
164f0 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
16500 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
16510 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
16520 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
16530 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
16540 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
16550 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
16560 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
16570 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
16580 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
16590 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
165a0 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
165b0 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
165c0 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
165d0 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
165e0 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
165f0 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
16600 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
16610 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
16620 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
16630 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
16640 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
16650 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
16660 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
16670 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
16680 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
16690 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
166a0 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69    ** white noisi
166b0 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  ng equaling 16 b
166c0 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
166d0 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
166e0 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
166f0 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
16700 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
16710 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
16720 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
16730 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
16740 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
16750 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16760 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
16770 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
16780 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
16790 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
167a0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
167b0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
167c0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
167d0 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
167e0 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
167f0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
16800 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
16810 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
16820 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
16830 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
16840 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
16850 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
16860 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
16870 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
16880 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
16890 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
168a0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
168b0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
168c0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
168d0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
168e0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
168f0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
16900 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
16910 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
16920 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
16930 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
16940 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
16950 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
16960 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
16970 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16980 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
16990 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
169a0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
169b0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
169c0 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
169d0 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
169e0 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
169f0 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
16a00 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
16a10 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
16a20 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
16a30 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
16a40 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
16a50 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
16a60 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
16a70 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
16a80 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
16a90 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
16aa0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
16ab0 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
16ac0 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
16ad0 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
16ae0 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
16af0 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
16b00 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
16b10 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
16b20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
16b30 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
16b40 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
16b50 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
16b60 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
16b70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
16b80 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
16b90 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
16ba0 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
16bb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16bc0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
16bd0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
16be0 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
16bf0 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d 20   *pPg;..  pPg = 
16c00 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
16c10 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b  up(pPager, iPg);
16c20 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
16c30 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61    if( sqlite3Pca
16c40 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28  chePageRefcount(
16c50 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pPg)==1 ){.     
16c60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
16c70 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  op(pPg);.    }el
16c80 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  se{.      rc = r
16c90 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
16ca0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16cb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16cc0 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
16cd0 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20  iter(pPg);.     
16ce0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
16cf0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
16d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16d10 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20   Normally, if a 
16d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
16d30 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20  olled back, any 
16d40 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
16d50 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65   are.  ** update
16d60 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70  d as data is cop
16d70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72  ied out of the r
16d80 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
16d90 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  and into the.  *
16da0 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
16db0 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c   is not generall
16dc0 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20  y possible with 
16dd0 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20  a WAL database, 
16de0 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  as.  ** rollback
16df0 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79   involves simply
16e00 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20   truncating the 
16e10 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66  log file. Theref
16e20 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  ore, if one.  **
16e30 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20   or more frames 
16e40 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
16e50 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
16e60 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66   log (and theref
16e70 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63  ore .  ** also c
16e80 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
16e90 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29  ackup databases)
16ea0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73   as part of this
16eb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
16ec0 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d  ** the backups m
16ed0 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64  ust be restarted
16ee0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
16ef0 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50  BackupRestart(pP
16f00 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a  ager->pBackup);.
16f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16f20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16f30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
16f40 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  o rollback a tra
16f50 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41  nsaction on a WA
16f60 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  L database..*/.s
16f70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52  tatic int pagerR
16f80 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72  ollbackWal(Pager
16f90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
16fa0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fc0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
16fd0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20   PgHdr *pList;  
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74   /* List of dirt
17000 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72  y pages to rever
17010 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  t */..  /* For a
17020 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ll pages in the 
17030 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63  cache that are c
17040 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f  urrently dirty o
17050 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  r have already. 
17060 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e   ** been written
17070 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74   (but not commit
17080 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20  ted) to the log 
17090 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20  file, do one of 
170a0 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  the .  ** follow
170b0 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
170c0 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63   + Discard the c
170d0 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72  ached page (if r
170e0 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a  efcount==0), or.
170f0 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20    **   + Reload 
17100 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  page content fro
17110 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  m the database (
17120 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a  if refcount>0)..
17130 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
17140 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
17150 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63  dbOrigSize;.  rc
17160 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64   = sqlite3WalUnd
17170 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
17180 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
17190 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  k, (void *)pPage
171a0 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  r);.  pList = sq
171b0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
171c0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
171d0 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  ache);.  while( 
171e0 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c  pList && rc==SQL
171f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
17200 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
17210 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
17220 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61  rc = pagerUndoCa
17230 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70  llback((void *)p
17240 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
17250 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  no);.    pList =
17260 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72   pNext;.  }..  r
17270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17280 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17290 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
172a0 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46  ound sqlite3WalF
172b0 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c  rames(). As well
172c0 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74   as logging.** t
172d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
172e0 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
172f0 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74   headed by pList
17300 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70   (connected by p
17310 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20  Dirty),.** this 
17320 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65  function notifie
17330 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63  s any active bac
17340 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68  kup processes th
17350 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76  at the pages hav
17360 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a  e.** changed. .*
17370 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
17380 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
17390 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
173c0 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
173d0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
173e0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
173f0 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
17400 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
17410 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17420 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
17430 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
17440 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
17450 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20 20  sCommit,        
17460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17470 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
17480 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
17490 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20 20  sync_flags      
174a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
174b0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
174c0 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29 20  OsSync() (or 0) 
174d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
17500 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
17510 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
17520 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  l );.  rc = sqli
17530 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
17540 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
17550 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
17560 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
17570 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
17580 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b 0a  sync_flags.  );.
17590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
175a0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
175b0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67  Backup ){.    Pg
175c0 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
175d0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
175e0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
175f0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
17600 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
17610 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
17620 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
17630 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
17640 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
17650 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e  egin a read tran
17660 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57  saction on the W
17670 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  AL..**.** This r
17680 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62  outine used to b
17690 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f  e called "pagerO
176a0 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62  penSnapshot()" b
176b0 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74  ecause it essent
176c0 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61  ially.** makes a
176d0 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65   snapshot of the
176e0 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
176f0 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69   current point i
17700 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65  n time and prese
17710 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61  rves.** that sna
17720 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79  pshot for use by
17730 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73   the reader in s
17740 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65  pite of concurre
17750 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a  ntly changes by.
17760 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73  ** other writers
17770 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72   or checkpointer
17780 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
17790 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
177a0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
177b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
177c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
177e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
177f0 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30   int changed = 0
17800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17810 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
17820 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20  e must be reset 
17830 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  */..  assert( pa
17840 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
17850 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74  ) );..  /* sqlit
17860 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
17870 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f  saction() was no
17880 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  t called for the
17890 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74   previous.  ** t
178a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f  ransaction in lo
178b0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
178c0 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69  SIVE.  So call i
178d0 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20  t now.  If we.  
178e0 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e  ** are in lockin
178f0 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e  g_mode=NORMAL an
17900 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73 20  d EndRead() was 
17910 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65  previously calle
17920 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c  d,.  ** the dupl
17930 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61  icate call is ha
17940 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rmless..  */.  s
17950 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64  qlite3WalEndRead
17960 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
17970 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63  er->pWal);..  rc
17980 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
17990 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
179a0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  n(pPager->pWal, 
179b0 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28  &changed);.  if(
179c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
179d0 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b  {.    int dummy;
179e0 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 64  .    if( changed
179f0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
17a00 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
17a10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
17a20 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
17a30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
17a40 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  lid==0 );.    }.
17a50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17a60 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
17a70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b 0a  Pager, &dummy);.
17a80 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
17a90 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
17aa0 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  ED;..  return rc
17ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
17ac0 20 66 6f 72 20 74 68 65 20 65 78 69 73 74 65 6e   for the existen
17ad0 63 65 20 6f 66 20 6f 72 20 64 65 6c 65 74 65 20  ce of or delete 
17ae0 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
17af0 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
17b00 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
17b10 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
17b20 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ger..**.** When 
17b30 70 45 78 69 73 74 73 21 3d 4e 55 4c 4c 2c 20 73  pExists!=NULL, s
17b40 65 74 20 2a 70 45 78 69 73 74 73 20 74 6f 20 31  et *pExists to 1
17b50 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
17b60 6c 65 20 65 78 69 73 74 73 2c 20 6f 72 20 30 0a  le exists, or 0.
17b70 2a 2a 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ** if the *-wal 
17b80 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
17b90 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ist..**.** When 
17ba0 70 45 78 69 73 74 73 3d 3d 4e 55 4c 4c 2c 20 64  pExists==NULL, d
17bb0 65 6c 65 74 65 20 74 68 65 20 2a 2d 77 61 6c 20  elete the *-wal 
17bc0 66 69 6c 65 20 69 66 20 69 74 20 65 78 69 73 74  file if it exist
17bd0 73 2c 20 6f 72 20 74 68 65 20 64 6f 0a 2a 2a 20  s, or the do.** 
17be0 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65 20 2a  nothing if the *
17bf0 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  -wal file does n
17c00 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ot exist..**.** 
17c10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17c20 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 49 66 20   on success. If 
17c30 6f 6e 20 61 6e 20 49 4f 20 6f 72 20 4f 4f 4d 20  on an IO or OOM 
17c40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
17c50 74 75 72 6e 0a 2a 2a 20 61 6e 20 53 51 4c 69 74  turn.** an SQLit
17c60 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
17c70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17c80 72 43 68 65 63 6b 46 6f 72 4f 72 44 65 6c 65 74  rCheckForOrDelet
17c90 65 57 41 4c 28 50 61 67 65 72 20 2a 70 50 61 67  eWAL(Pager *pPag
17ca0 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
17cb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
17ce0 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
17cf0 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
17d00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
17d10 20 6f 66 20 74 68 65 20 57 41 4c 20 66 69 6c 65   of the WAL file
17d20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21   */..  assert( !
17d30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17d40 20 29 3b 0a 20 20 7a 57 61 6c 20 3d 20 73 71 6c   );.  zWal = sql
17d50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
17d60 2d 77 61 6c 22 2c 20 70 50 61 67 65 72 2d 3e 7a  -wal", pPager->z
17d70 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
17d80 20 21 7a 57 61 6c 20 29 7b 0a 20 20 20 20 72 63   !zWal ){.    rc
17d90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
17da0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
17db0 28 20 70 45 78 69 73 74 73 20 29 7b 0a 20 20 20  ( pExists ){.   
17dc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17dd0 73 41 63 63 65 73 73 28 70 50 61 67 65 72 2d 3e  sAccess(pPager->
17de0 70 56 66 73 2c 20 7a 57 61 6c 2c 20 53 51 4c 49  pVfs, zWal, SQLI
17df0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
17e00 2c 20 70 45 78 69 73 74 73 29 3b 0a 20 20 20 20  , pExists);.    
17e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
17e20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
17e30 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
17e40 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  zWal, 0);.    }.
17e50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
17e60 28 7a 57 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65  (zWal);.  }.  re
17e70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17e80 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
17e90 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
17ea0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
17eb0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
17ec0 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
17ed0 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
17ee0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
17ef0 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
17f00 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
17f10 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
17f20 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
17f30 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
17f40 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
17f50 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
17f60 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
17f70 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
17f80 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
17f90 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
17fa0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
17fb0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
17fc0 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
17fd0 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
17fe0 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
17ff0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
18000 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
18010 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
18020 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
18030 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
18040 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
18050 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
18060 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
18070 2a 2a 20 49 66 20 74 68 65 20 57 41 4c 20 66 69  ** If the WAL fi
18080 6c 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 61 6c  le is opened, al
18090 73 6f 20 6f 70 65 6e 20 61 20 73 6e 61 70 73 68  so open a snapsh
180a0 6f 74 20 28 72 65 61 64 20 74 72 61 6e 73 61 63  ot (read transac
180b0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tion)..**.** The
180c0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c   caller must hol
180d0 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  d a SHARED lock 
180e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
180f0 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  file to call thi
18100 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42  s.** function. B
18110 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53  ecause an EXCLUS
18120 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
18130 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  db file is requi
18140 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a  red to delete .*
18150 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e  * a WAL on a non
18160 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  e-empty database
18170 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
18180 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20  here is no race 
18190 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65  condition .** be
181a0 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73  tween the xAcces
181b0 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e  s() below and an
181c0 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67   xDelete() being
181d0 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d   executed by som
181e0 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e  e .** other conn
181f0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
18200 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57  c int pagerOpenW
18210 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65  alIfPresent(Page
18220 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
18230 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18240 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
18250 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
18260 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18280 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
18290 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
182a0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
182c0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
182d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
182e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
182f0 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
18300 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  _LOCK );.    rc 
18310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
18320 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
18330 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
18340 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
18350 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
18360 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
18370 70 61 67 65 72 43 68 65 63 6b 46 6f 72 4f 72 44  pagerCheckForOrD
18380 65 6c 65 74 65 57 41 4c 28 70 50 61 67 65 72 2c  eleteWAL(pPager,
18390 20 30 29 3b 0a 20 20 20 20 20 20 69 73 57 61 6c   0);.      isWal
183a0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
183b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
183c0 72 43 68 65 63 6b 46 6f 72 4f 72 44 65 6c 65 74  rCheckForOrDelet
183d0 65 57 41 4c 28 70 50 61 67 65 72 2c 20 26 69 73  eWAL(pPager, &is
183e0 57 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Wal);.    }.    
183f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18400 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
18410 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
18420 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
18430 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
18440 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
18450 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
18460 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18480 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
18490 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
184a0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
184b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
184c0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
184d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
184e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
184f0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
18500 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18510 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
18520 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
18530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18540 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18550 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18560 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
18570 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
18580 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
18590 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
185a0 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
185b0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
185c0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
185d0 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
185e0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
185f0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
18600 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
18610 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
18620 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
18630 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
18640 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
18650 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
18660 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
18670 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
18680 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
18690 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
186a0 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
186b0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
186c0 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
186d0 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
186e0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
186f0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
18700 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
18710 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
18720 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
18730 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
18740 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
18750 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
18760 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
18770 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
18780 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
18790 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
187a0 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
187b0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
187c0 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
187d0 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
187e0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
187f0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
18800 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
18810 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
18820 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
18830 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
18840 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
18850 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
18860 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
18870 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
18880 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
18890 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
188a0 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
188b0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
188c0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
188d0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
188e0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
188f0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
18900 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
18910 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
18920 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
18930 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
18940 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
18950 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
18960 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
18970 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
18980 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
18990 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
189a0 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
189b0 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
189c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
189d0 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
189e0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
189f0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
18a00 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
18a10 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
18a20 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
18a30 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
18a40 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
18a50 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
18a60 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
18a70 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
18a80 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
18a90 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
18aa0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
18ab0 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
18ac0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
18ad0 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
18ae0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
18af0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
18b00 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
18b10 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
18b20 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
18b30 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
18b40 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
18b50 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
18b60 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
18b70 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
18b80 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
18b90 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
18ba0 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
18bb0 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
18bc0 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
18bd0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
18be0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
18bf0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
18c00 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
18c10 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
18c20 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
18c30 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
18c40 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
18c50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
18c60 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
18c70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
18c80 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
18c90 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
18ca0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
18cb0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
18cc0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
18cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
18ce0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
18cf0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
18d00 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
18d10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18d20 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
18d30 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
18d40 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
18d50 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
18d60 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
18d70 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
18d80 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
18d90 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18da0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
18db0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
18dc0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
18dd0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
18de0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
18df0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
18e00 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
18e10 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
18e20 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
18e30 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
18e40 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
18e50 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
18e60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18e70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18e80 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
18e90 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
18ea0 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
18eb0 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
18ec0 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
18ed0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
18ee0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
18ef0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
18f00 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
18f10 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
18f20 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
18f30 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
18f40 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
18f50 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
18f60 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
18f70 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
18f80 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
18f90 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
18fa0 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
18fb0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
18fc0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
18fd0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
18fe0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
18ff0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
19000 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
19010 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
19020 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
19030 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
19040 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
19050 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
19060 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
19070 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
19080 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
19090 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
190a0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
190b0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
190c0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
190d0 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
190e0 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
190f0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
19100 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
19110 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
19120 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
19130 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
19140 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
19150 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
19160 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
19170 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
19180 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
19190 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
191a0 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
191b0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
191c0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
191d0 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
191e0 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
191f0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
19200 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
19210 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
19220 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
19230 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
19240 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
19250 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
19260 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
19270 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
19280 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
19290 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
192a0 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
192b0 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
192c0 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
192d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
192e0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
192f0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
19300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19310 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19320 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
19330 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19340 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
19350 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
19360 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
19370 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
19380 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19390 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
193a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
193b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
193c0 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
193d0 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
193e0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
193f0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
19400 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
19410 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
19420 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
19430 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
19440 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
19450 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
19460 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
19470 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
19480 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
19490 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
194a0 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
194b0 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
194c0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
194d0 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
194e0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
194f0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
19500 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
19510 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
19520 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
19530 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
19540 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
19550 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
19560 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
19570 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
19580 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
19590 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
195a0 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
195b0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
195c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
195d0 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
195e0 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
195f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
19600 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
19610 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
19620 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
19630 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
19640 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
19650 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
19660 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
19670 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
19680 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
19690 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
196a0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
196b0 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
196c0 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
196d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
196e0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
196f0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
19700 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
19710 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
19720 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
19730 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
19740 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
19750 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
19760 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
19770 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
19780 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
19790 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
197a0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
197b0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
197c0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
197d0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
197e0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
197f0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
19800 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
19810 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
19820 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
19830 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
19840 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
19850 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
19860 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
19870 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
19880 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
19890 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
198a0 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
198b0 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
198c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
198d0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
198e0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
198f0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
19900 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
19910 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
19920 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
19930 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
19940 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
19950 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19960 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
19970 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
19980 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
19990 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
199a0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
199b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
199c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
199d0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
199e0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
199f0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
19a00 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
19a10 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
19a20 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
19a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
19a40 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
19a50 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
19a60 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
19a70 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
19a80 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
19a90 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
19aa0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
19ab0 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
19ac0 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
19ad0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
19ae0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
19af0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
19b00 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
19b10 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
19b20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19b30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19b40 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
19b50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19b60 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19b70 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
19b80 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
19b90 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
19ba0 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
19bb0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
19bc0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
19bd0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
19be0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
19bf0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
19c00 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
19c10 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
19c20 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
19c30 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
19c40 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
19c50 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19c60 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
19c70 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
19c80 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
19c90 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
19ca0 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
19cb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
19cc0 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
19cd0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
19ce0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
19cf0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
19d00 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
19d10 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
19d20 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
19d30 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
19d40 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
19d50 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
19d60 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
19d70 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
19d80 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
19d90 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
19da0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
19db0 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
19dc0 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
19dd0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
19de0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
19df0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
19e00 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
19e10 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
19e20 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
19e30 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
19e40 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
19e50 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
19e60 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
19e70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19e80 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
19e90 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
19ea0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
19eb0 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
19ec0 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
19ed0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19ee0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
19ef0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
19f00 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
19f10 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
19f20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
19f30 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
19f40 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
19f50 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
19f60 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
19f70 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
19f80 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
19f90 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
19fa0 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
19fb0 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
19fd0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
19fe0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
19ff0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1a000 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
1a010 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
1a020 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
1a030 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
1a040 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
1a050 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1a060 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
1a070 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
1a080 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
1a090 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
1a0a0 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
1a0b0 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
1a0c0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
1a0d0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
1a0e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1a0f0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
1a100 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
1a110 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
1a120 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1a130 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
1a140 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
1a150 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
1a160 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
1a170 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
1a180 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
1a190 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
1a1a0 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
1a1b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a1c0 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
1a1d0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
1a1e0 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
1a1f0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
1a200 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
1a210 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
1a220 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
1a230 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
1a240 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
1a250 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
1a260 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
1a270 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
1a280 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1a290 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
1a2a0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
1a2b0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
1a2c0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
1a2d0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
1a2e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
1a2f0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
1a300 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
1a310 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
1a320 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
1a330 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1a340 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
1a350 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
1a360 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
1a370 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
1a380 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
1a390 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
1a3a0 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
1a3b0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
1a3c0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
1a3d0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
1a3e0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
1a3f0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
1a400 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
1a410 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
1a420 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
1a430 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
1a440 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
1a450 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
1a460 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
1a470 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
1a480 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
1a490 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
1a4a0 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
1a4b0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1a4c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
1a4d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1a4e0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
1a4f0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
1a500 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1a510 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
1a520 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a530 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
1a540 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1a550 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
1a560 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
1a570 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
1a580 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
1a590 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
1a5a0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
1a5b0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
1a5c0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
1a5d0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
1a5e0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1a5f0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
1a600 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1a610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a620 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
1a630 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1a640 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
1a650 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
1a660 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
1a670 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
1a680 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
1a690 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
1a6a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a6b0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1a6c0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1a6d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1a6e0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
1a6f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a700 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
1a710 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1a720 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
1a730 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
1a740 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
1a750 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1a760 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
1a770 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a780 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1a790 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
1a7a0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1a7b0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
1a7c0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
1a7d0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
1a7e0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
1a7f0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
1a800 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
1a810 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
1a820 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
1a830 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
1a840 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
1a850 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
1a860 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
1a870 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
1a880 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
1a890 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a8a0 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
1a8b0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
1a8c0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
1a8d0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
1a8e0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
1a8f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
1a900 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
1a910 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1a920 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
1a930 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
1a940 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
1a950 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
1a960 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
1a970 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
1a980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a9a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1a9b0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
1a9c0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
1a9d0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
1a9e0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
1a9f0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
1aa00 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
1aa10 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
1aa20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
1aa30 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
1aa40 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
1aa50 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
1aa60 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
1aa70 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
1aa80 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
1aa90 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
1aaa0 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
1aab0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
1aac0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
1aad0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
1aae0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
1aaf0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
1ab00 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
1ab10 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1ab20 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
1ab30 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
1ab40 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab60 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1ab70 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
1ab80 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
1ab90 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
1aba0 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
1abb0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
1abc0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
1abd0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
1abe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
1abf0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
1ac00 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
1ac10 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
1ac20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
1ac30 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
1ac40 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1ac50 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
1ac60 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
1ac70 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
1ac80 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
1ac90 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
1aca0 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
1acb0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
1acc0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
1acd0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
1ace0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
1acf0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
1ad00 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1ad10 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
1ad20 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
1ad30 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
1ad40 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
1ad50 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
1ad60 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad80 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
1ad90 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
1ada0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
1adb0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
1adc0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
1add0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
1ade0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
1adf0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
1ae00 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
1ae10 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
1ae20 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
1ae30 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
1ae40 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
1ae50 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
1ae60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1ae70 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
1ae80 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
1ae90 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1aea0 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
1aeb0 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
1aec0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
1aed0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
1aee0 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
1aef0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
1af00 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
1af10 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
1af20 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
1af30 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
1af40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1af50 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
1af60 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
1af70 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
1af80 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
1af90 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
1afa0 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
1afb0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
1afc0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
1afd0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
1afe0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
1aff0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1b000 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
1b010 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
1b020 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1b030 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
1b040 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1b050 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
1b060 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
1b070 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
1b080 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
1b090 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
1b0a0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
1b0b0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
1b0c0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
1b0d0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
1b0e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
1b0f0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
1b100 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1b110 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
1b120 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
1b130 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
1b140 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1b150 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
1b160 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1b170 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
1b180 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
1b190 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
1b1a0 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
1b1b0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
1b1c0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
1b1d0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
1b1e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1b1f0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
1b200 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
1b210 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
1b220 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
1b230 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
1b240 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
1b250 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
1b260 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
1b270 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
1b280 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
1b290 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
1b2a0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
1b2b0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
1b2c0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
1b2d0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
1b2e0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
1b2f0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
1b300 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1b310 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1b320 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1b330 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1b340 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
1b350 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
1b360 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
1b370 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
1b380 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b390 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
1b3a0 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
1b3b0 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
1b3c0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
1b3d0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
1b3e0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
1b3f0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
1b400 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
1b410 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
1b420 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1b430 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
1b440 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1b450 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1b460 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  e)==0 .     && p
1b470 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
1b480 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
1b490 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  eSize .    ){.  
1b4a0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
1b4b0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1b4c0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
1b4d0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
1b4e0 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
1b4f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1b500 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1b510 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1b520 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1b530 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1b540 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1b550 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1b560 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
1b570 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
1b580 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1b590 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
1b5a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b5b0 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
1b5c0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1b5d0 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
1b5e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b5f0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
1b600 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
1b610 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73  ze;.    if( nRes
1b620 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
1b630 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
1b640 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
1b650 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
1b660 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
1b670 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
1b680 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
1b690 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
1b6a0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
1b6b0 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1b6c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b6d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1b6e0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
1b6f0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
1b700 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
1b710 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
1b720 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
1b730 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
1b740 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
1b750 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
1b760 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
1b770 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
1b780 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
1b790 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
1b7a0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
1b7b0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
1b7c0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
1b7d0 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
1b7e0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
1b7f0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
1b800 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
1b810 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
1b820 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
1b830 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
1b840 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
1b850 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
1b860 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1b870 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1b880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1b890 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
1b8a0 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
1b8b0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
1b8c0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
1b8d0 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
1b8e0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
1b8f0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1b900 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
1b910 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
1b920 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
1b930 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
1b940 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b950 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
1b960 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
1b970 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
1b980 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
1b990 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
1b9a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
1b9b0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
1b9c0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
1b9d0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  age){.  int nPag
1b9e0 65 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  e;.  if( mxPage>
1b9f0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
1ba00 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
1ba10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1ba20 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1ba30 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  _UNLOCK ){.    s
1ba40 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1ba50 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1ba60 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  age);.    assert
1ba70 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
1ba80 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 7d 0a 20  >=nPage );.  }. 
1ba90 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1baa0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
1bab0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
1bac0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
1bad0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
1bae0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
1baf0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
1bb00 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
1bb10 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1bb20 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
1bb30 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
1bb40 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
1bb50 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1bb60 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
1bb70 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
1bb80 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
1bb90 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
1bba0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
1bbb0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
1bbc0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
1bbd0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
1bbe0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1bbf0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1bc00 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
1bc10 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1bc20 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
1bc30 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
1bc40 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
1bc50 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
1bc60 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
1bc70 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1bc80 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
1bc90 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1bca0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
1bcb0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
1bcc0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
1bcd0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
1bce0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
1bcf0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
1bd00 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
1bd10 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
1bd20 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
1bd30 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
1bd40 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1bd50 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1bd60 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
1bd70 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
1bd80 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1bd90 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
1bda0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
1bdb0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
1bdc0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
1bdd0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
1bde0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
1bdf0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
1be00 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
1be10 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
1be20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
1be30 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1be40 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
1be50 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1be60 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
1be70 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
1be80 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
1be90 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1bea0 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
1beb0 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
1bec0 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
1bed0 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
1bee0 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
1bef0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
1bf00 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
1bf10 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
1bf20 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
1bf30 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
1bf40 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1bf50 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1bf60 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
1bf70 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1bf80 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
1bf90 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1bfa0 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
1bfb0 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
1bfc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1bfd0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
1bfe0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1bff0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
1c000 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
1c010 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c020 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
1c030 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
1c040 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1c050 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1c060 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1c070 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
1c080 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
1c090 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
1c0a0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
1c0b0 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
1c0c0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
1c0d0 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
1c0e0 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
1c0f0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
1c100 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
1c110 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
1c120 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
1c130 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 20  (pPager) );.#if 
1c140 30 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  0.  if( pagerUse
1c150 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1c160 20 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d     int isInWal =
1c170 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
1c180 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67  ite3WalRead(pPag
1c190 65 72 2d 3e 70 57 61 6c 2c 20 31 2c 20 26 69 73  er->pWal, 1, &is
1c1a0 49 6e 57 61 6c 2c 20 4e 2c 20 70 44 65 73 74 29  InWal, N, pDest)
1c1b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1c1c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 49 6e 57  LITE_OK || isInW
1c1d0 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  al ){.      retu
1c1e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1c1f0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1c200 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1c210 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
1c220 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
1c230 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
1c240 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c250 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1c260 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
1c270 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1c280 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1c290 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1c2a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c2b0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c2c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1c2d0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
1c2e0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1c2f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c300 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
1c310 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e  .** with pPager.
1c320 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
1c330 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  is calculated as
1c340 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e   (<db file size>
1c350 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a  /<page-size>)..*
1c360 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
1c370 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
1c380 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
1c390 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
1c3a0 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
1c3b0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
1c3c0 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a   1 page file..**
1c3d0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1c3e0 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61   is in error sta
1c3f0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
1c400 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1c410 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72   then the.** err
1c420 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
1c430 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1c440 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74  and *pnPage left
1c450 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a   unchanged. Or,.
1c460 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ** if the file s
1c470 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20  ystem has to be 
1c480 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20  queried for the 
1c490 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1c4a0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72   and.** the quer
1c4b0 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e  y attempt return
1c4c0 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74  s an IO error, t
1c4d0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1c4e0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1c4f0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1c500 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
1c510 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1c520 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1c530 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
1c540 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
1c550 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a  eturned.** and *
1c560 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  pnPage is set to
1c570 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1c580 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1c590 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1c5a0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1c5b0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1c5c0 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
1c5d0 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
1c5e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
1c5f0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1c600 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1c610 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
1c620 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1c630 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53  s in the file. S
1c640 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61  tore this in nPa
1c650 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ge. */.  if( pPa
1c660 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1c670 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
1c680 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1c690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c6a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c6b0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65       /* Error re
1c6c0 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
1c6d0 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36  Size() */.    i6
1c6e0 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1c6f0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69        /* File si
1c700 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75  ze in bytes retu
1c710 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69  rned by OsFileSi
1c720 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ze() */..    if(
1c730 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1c740 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
1c750 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1c760 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OCK ){.      sql
1c770 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
1c780 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e 50 61  ager->pWal, &nPa
1c790 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ge);.    }..    
1c7a0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1c7b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1c7c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1c7d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1c7e0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66  File );.      if
1c7f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c800 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >fd) ){.        
1c810 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
1c820 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c830 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1c840 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20 20 20  d, &n)) ){.     
1c850 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
1c860 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1c870 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c880 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1c890 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1c8a0 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
1c8b0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1c8c0 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1c8d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c8e0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1c8f0 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70  o)(n / pPager->p
1c900 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1c910 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1c920 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c930 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1c940 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c950 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1c960 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1c970 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1c980 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c990 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  izeValid = 1;.  
1c9a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1c9b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1c9c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1c9d0 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1c9e0 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ter than the .  
1c9f0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1ca00 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1ca10 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1ca20 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1ca30 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1ca40 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1ca50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1ca60 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1ca70 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1ca80 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1ca90 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPage;.  }..  /*
1caa0 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
1cab0 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74  variable and ret
1cac0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  urn SQLITE_OK */
1cad0 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1cae0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1caf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1cb00 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
1cb10 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
1cb20 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
1cb30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1cb40 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
1cb50 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
1cb60 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
1cb70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1cb80 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
1cb90 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
1cba0 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
1cbb0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1cbc0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
1cbd0 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
1cbe0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
1cbf0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
1cc00 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
1cc10 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
1cc20 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
1cc30 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
1cc40 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
1cc50 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
1cc60 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
1cc70 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
1cc80 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
1cc90 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
1cca0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1ccb0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
1ccc0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1ccd0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
1cce0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
1ccf0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
1cd00 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
1cd10 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
1cd20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
1cd30 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
1cd40 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
1cd50 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1cd60 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
1cd70 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
1cd80 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
1cd90 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cdc0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
1cdd0 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
1cde0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1cdf0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1ce00 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
1ce10 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
1ce20 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
1ce30 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
1ce40 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
1ce50 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
1ce60 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1ce70 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1ce80 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1ce90 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1cea0 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
1ceb0 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
1cec0 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
1ced0 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20  e unknown. It.  
1cee0 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65  ** must not have
1cef0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
1cf00 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
1cf10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1cf20 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1cf30 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
1cf40 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
1cf50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1cf60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1cf70 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
1cf80 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1cf90 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
1cfa0 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
1cfb0 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
1cfc0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
1cfd0 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
1cfe0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
1cff0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
1d000 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
1d010 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
1d020 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
1d030 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
1d040 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1d050 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
1d060 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1d070 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
1d080 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1d090 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
1d0a0 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
1d0b0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
1d0c0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1d0d0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
1d0e0 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
1d0f0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
1d100 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
1d110 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
1d120 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
1d130 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
1d140 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
1d150 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
1d160 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
1d180 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1d190 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1d1a0 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
1d1b0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
1d1c0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1d1d0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
1d1e0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
1d1f0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
1d200 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d220 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1d230 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
1d240 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
1d250 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
1d260 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
1d270 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1d280 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d290 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
1d2a0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
1d2b0 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
1d2c0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1d2d0 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
1d2e0 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
1d2f0 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
1d300 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1d310 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
1d320 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
1d330 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
1d340 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1d350 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
1d360 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
1d370 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
1d380 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
1d390 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
1d3a0 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
1d3b0 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
1d3c0 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
1d3d0 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
1d3e0 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
1d3f0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
1d400 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
1d410 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
1d420 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
1d430 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
1d440 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
1d450 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1d460 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
1d470 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1d480 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
1d490 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
1d4a0 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
1d4b0 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
1d4c0 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
1d4d0 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
1d4e0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
1d4f0 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
1d500 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
1d510 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
1d520 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
1d530 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1d540 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
1d550 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
1d560 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
1d570 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
1d580 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
1d590 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65  haviour would be
1d5a0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1d5b0 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
1d5c0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
1d5d0 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
1d5e0 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
1d5f0 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
1d600 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
1d610 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
1d620 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
1d630 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1d640 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
1d650 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
1d660 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
1d670 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
1d680 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
1d690 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
1d6a0 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
1d6b0 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
1d6c0 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
1d6d0 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
1d6e0 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
1d6f0 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
1d700 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1d710 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
1d720 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d730 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
1d740 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
1d750 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d760 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
1d770 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
1d780 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
1d790 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
1d7a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
1d7b0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
1d7c0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d7d0 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
1d7e0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1d7f0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
1d800 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
1d810 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
1d820 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
1d830 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1d840 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
1d850 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
1d860 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
1d870 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
1d880 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1d890 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
1d8a0 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
1d8b0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
1d8c0 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
1d8d0 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
1d8e0 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
1d8f0 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
1d900 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
1d910 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
1d920 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
1d930 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
1d940 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
1d950 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
1d960 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1d970 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
1d980 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1d990 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1d9a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1d9b0 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
1d9c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1d9d0 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
1d9e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1d9f0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
1da00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1da10 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1da20 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
1da30 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
1da40 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
1da50 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1da60 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
1da70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1da80 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
1da90 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
1daa0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1dab0 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
1dac0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1dad0 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
1dae0 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
1daf0 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
1db00 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
1db10 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
1db20 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
1db30 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
1db40 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
1db50 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
1db60 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
1db70 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
1db80 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
1db90 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
1dba0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
1dbb0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
1dbc0 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
1dbd0 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
1dbe0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
1dbf0 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
1dc00 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
1dc10 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
1dc20 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
1dc30 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
1dc40 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
1dc50 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
1dc60 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
1dc70 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1dc80 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
1dc90 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
1dca0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1dcb0 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
1dcc0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1dcd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1dce0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
1dcf0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1dd00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1dd10 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
1dd20 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1dd30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1dd40 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1dd50 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
1dd60 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
1dd70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dd80 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1dd90 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1dda0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
1ddb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1ddc0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ddd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
1dde0 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
1ddf0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
1de00 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
1de10 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
1de20 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
1de30 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
1de40 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
1de50 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1de60 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
1de70 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1de80 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
1de90 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
1dea0 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
1deb0 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
1dec0 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
1ded0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
1dee0 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
1def0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
1df00 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
1df10 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1df20 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
1df30 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
1df40 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
1df50 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1df60 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
1df70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1df80 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
1df90 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
1dfa0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
1dfb0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1dfc0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
1dfd0 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
1dfe0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
1dff0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
1e000 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
1e010 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
1e020 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
1e030 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1e040 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
1e050 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
1e060 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
1e070 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1e080 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
1e090 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
1e0a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
1e0b0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
1e0c0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1e0d0 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
1e0e0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
1e0f0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
1e100 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
1e110 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
1e120 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20  ager->pWal,.    
1e130 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
1e140 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
1e150 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20  nc_flags), .    
1e160 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e170 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50  , pTmp.  );.  pP
1e180 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
1e190 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
1e1a0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1e1b0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1e1c0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1e1d0 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1e1e0 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
1e1f0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
1e200 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
1e210 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
1e220 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
1e230 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
1e240 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
1e250 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
1e260 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
1e270 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
1e280 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
1e290 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
1e2a0 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
1e2b0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
1e2c0 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
1e2d0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
1e2e0 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
1e2f0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
1e300 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
1e310 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
1e320 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
1e330 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1e340 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e350 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1e360 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  fd) ){.      pPa
1e370 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70  ger->errCode = p
1e380 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
1e390 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1e3a0 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
1e3b0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1e3c0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
1e3d0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1e3e0 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
1e3f0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1e400 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
1e410 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
1e420 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1e430 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
1e440 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1e450 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1e460 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1e470 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
1e480 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
1e490 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
1e4a0 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
1e4b0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
1e4c0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1e4d0 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
1e4e0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
1e4f0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
1e500 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
1e510 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
1e520 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
1e530 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
1e540 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
1e550 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
1e560 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
1e570 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
1e580 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
1e590 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1e5a0 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
1e5b0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
1e5c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e5d0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
1e5e0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
1e5f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1e600 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
1e610 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1e620 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
1e630 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
1e640 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
1e650 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1e660 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
1e670 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e680 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
1e690 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1e6a0 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
1e6b0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1e6c0 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
1e6d0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
1e6e0 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
1e6f0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
1e700 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
1e710 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
1e720 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
1e730 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
1e740 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1e750 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
1e760 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
1e770 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
1e780 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
1e790 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
1e7a0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
1e7b0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1e7c0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1e7d0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1e7e0 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c  flag is not set,
1e7f0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1e800 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f  ion is a.** no-o
1e810 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
1e820 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
1e830 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
1e840 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a   journal-mode.**
1e850 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20   and the device 
1e860 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e870 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d  of the the file-
1e880 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
1e890 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
1e8a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e8b0 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
1e8c0 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
1e8d0 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
1e8e0 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
1e8f0 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
1e900 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
1e910 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
1e920 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
1e930 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
1e940 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
1e950 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
1e960 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
1e970 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
1e980 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
1e990 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
1e9a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1e9b0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
1e9c0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
1e9d0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
1e9e0 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
1e9f0 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
1ea00 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
1ea10 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
1ea20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1ea30 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
1ea40 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
1ea50 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
1ea60 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
1ea70 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
1ea80 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
1ea90 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
1eaa0 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
1eab0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1eac0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
1ead0 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
1eae0 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
1eaf0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
1eb00 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
1eb10 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
1eb20 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
1eb30 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
1eb40 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
1eb50 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1eb60 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
1eb70 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
1eb80 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
1eb90 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
1eba0 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
1ebb0 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
1ebc0 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64  * The Pager.need
1ebd0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76  Sync flag is nev
1ebe0 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65  er be set for te
1ebf0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f  mporary files, o
1ec00 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70  r any.** file op
1ec10 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  erating in no-sy
1ec20 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e  nc mode (Pager.n
1ec30 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e  oSync set to non
1ec40 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  -zero)..**.** If
1ec50 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
1ec60 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
1ec70 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
1ec80 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
1ec90 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
1eca0 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
1ecb0 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
1ecc0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
1ecd0 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
1ece0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1ecf0 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
1ed00 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1ed10 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1ed20 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
1ed30 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
1ed40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ed50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
1ed60 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  dSync ){.    ass
1ed70 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
1ed80 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1ed90 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1eda0 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
1edb0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
1edc0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1edf0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1ee00 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
1ee10 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
1ee20 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1ee30 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1ee40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ee50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1ee60 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
1ee70 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1ee80 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1ee90 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
1eea0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
1eeb0 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
1eec0 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
1eed0 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
1eee0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
1eef0 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
1ef00 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
1ef10 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
1ef20 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
1ef30 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
1ef40 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1ef50 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
1ef60 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
1ef70 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
1ef80 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1ef90 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
1efa0 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
1efb0 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
1efc0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
1efd0 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
1efe0 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
1eff0 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
1f000 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
1f010 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
1f020 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
1f030 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1f040 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1f050 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1f060 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1f070 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1f080 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1f090 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1f0a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1f0b0 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1f0c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1f0d0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1f0e0 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1f0f0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1f100 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1f110 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1f120 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1f130 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1f140 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1f150 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1f160 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1f170 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1f180 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1f190 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1f1a0 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1f1b0 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1f1c0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1f1d0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1f1e0 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1f1f0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1f200 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1f210 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1f220 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1f230 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1f240 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1f250 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1f260 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1f270 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1f280 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1f290 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1f2a0 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1f2b0 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1f2c0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1f2d0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1f2e0 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1f2f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1f300 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1f310 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1f320 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1f330 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1f340 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1f350 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1f360 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1f370 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1f380 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1f390 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1f3a0 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1f3b0 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1f3c0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1f3d0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1f3e0 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1f3f0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1f400 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1f410 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1f420 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
1f430 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
1f440 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
1f450 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1f460 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
1f470 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
1f480 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
1f490 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
1f4a0 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
1f4b0 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
1f4c0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1f4d0 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
1f4e0 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
1f4f0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
1f500 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
1f510 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1f520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f530 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
1f540 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
1f550 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
1f560 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1f570 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
1f580 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
1f590 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
1f5a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1f5b0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
1f5c0 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
1f5d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f5e0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1f5f0 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
1f600 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
1f610 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
1f620 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f630 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1f640 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1f650 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1f660 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f670 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f680 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1f690 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
1f6a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f6b0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
1f6c0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
1f6d0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
1f6e0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
1f6f0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
1f700 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
1f710 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
1f720 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
1f730 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
1f740 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
1f750 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
1f760 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
1f770 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
1f780 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1f790 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
1f7a0 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
1f7b0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
1f7c0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
1f7d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
1f7e0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1f7f0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
1f800 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
1f810 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
1f820 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
1f830 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
1f840 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
1f850 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
1f860 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
1f870 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
1f880 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
1f890 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1f8a0 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
1f8b0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
1f8c0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
1f8d0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
1f8e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1f8f0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1f900 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1f910 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f920 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
1f930 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1f940 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1f950 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1f960 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
1f970 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1f980 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1f990 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f9a0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1f9b0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1f9c0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
1f9d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f9e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f9f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1fa00 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
1fa10 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
1fa20 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1fa30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1fa40 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1fa50 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1fa60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1fa70 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
1fa80 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
1fa90 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
1faa0 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
1fab0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1fac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1fad0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1fae0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1faf0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1fb00 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
1fb10 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1fb20 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1fb30 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1fb40 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1fb50 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1fb60 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1fb70 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
1fb80 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1fb90 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1fba0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1fbb0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
1fbc0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1fbd0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1fbe0 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
1fbf0 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
1fc00 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1fc10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fc20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1fc30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1fc40 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
1fc50 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63  ile was just suc
1fc60 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
1fc70 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64  . Set Pager.need
1fc80 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20  Sync .    ** to 
1fc90 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74  zero and clear t
1fca0 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1fcb0 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70  NC flag on all p
1fcc0 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  agess..    */.  
1fcd0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1fce0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
1fcf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1fd00 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ed = 1;.    pPag
1fd10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
1fd20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1fd30 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Off;.    sqlite3
1fd40 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
1fd50 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
1fd60 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ache);.  }..  re
1fd70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fd80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
1fd90 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
1fda0 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
1fdb0 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1fdc0 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
1fdd0 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
1fde0 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
1fdf0 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
1fe00 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
1fe10 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
1fe20 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
1fe30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fe40 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
1fe50 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
1fe60 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
1fe70 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
1fe80 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
1fe90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
1fea0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1feb0 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
1fec0 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
1fed0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
1fee0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
1fef0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
1ff00 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
1ff10 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
1ff20 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
1ff30 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
1ff40 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
1ff50 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
1ff60 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
1ff70 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
1ff80 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1ff90 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
1ffa0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
1ffb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ffc0 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
1ffd0 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
1ffe0 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
1fff0 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
20000 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
20010 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
20020 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
20030 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
20040 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
20050 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
20060 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
20070 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
20080 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
20090 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
200a0 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
200b0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
200c0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
200d0 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
200e0 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
200f0 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
20100 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
20110 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
20120 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
20130 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
20140 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
20150 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
20160 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
20170 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
20180 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
20190 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
201a0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
201b0 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
201c0 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
201d0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
201e0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
201f0 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
20200 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
20210 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
20220 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
20230 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
20240 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
20250 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
20260 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
20270 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
20280 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
20290 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
202a0 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
202b0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
202c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
202d0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
202e0 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
202f0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
20300 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
20310 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
20320 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
20330 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
20340 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
20350 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
20360 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
20370 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
20380 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
20390 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
203b0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
203c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
203f0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n code */..  if(
20400 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29   NEVER(pList==0)
20410 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20420 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
20430 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
20440 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
20450 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
20460 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
20470 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
20480 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
20490 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
204a0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
204b0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
204c0 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
204d0 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73  ing.  ** call is
204e0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
204f0 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
20500 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
20510 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
20520 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
20530 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
20540 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
20550 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
20560 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
20570 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
20580 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
20590 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
205a0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
205b0 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
205c0 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
205d0 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
205e0 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
205f0 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
20600 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
20610 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
20620 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
20630 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
20640 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
20650 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
20660 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
20670 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
20680 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
20690 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
206a0 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
206b0 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
206c0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
206d0 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
206e0 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
206f0 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
20700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
20710 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
20720 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
20730 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
20740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20750 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
20760 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
20770 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
20780 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
20790 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
207a0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
207b0 73 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50 61  seWal(pList->pPa
207c0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
207d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
207e0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
207f0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
20800 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
20810 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
20820 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  OCK);..  /* If t
20830 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
20840 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
20850 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
20860 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
20870 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
20880 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
20890 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
208a0 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
208b0 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
208c0 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
208d0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
208e0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
208f0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
20900 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
20910 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
20920 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
20930 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
20940 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
20950 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
20960 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
20970 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
20980 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
20990 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
209a0 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
209b0 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
209c0 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
209d0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
209e0 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
209f0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
20a00 7a 65 20 3e 20 28 70 50 61 67 65 72 2d 3e 64 62  ze > (pPager->db
20a10 4f 72 69 67 53 69 7a 65 2b 31 29 20 26 26 20 69  OrigSize+1) && i
20a20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
20a30 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
20a40 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
20a50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20a60 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
20a70 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
20a80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
20a90 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
20aa0 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
20ab0 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
20ac0 73 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20 20  szFile);.  }..  
20ad0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
20ae0 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
20af0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
20b00 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
20b10 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
20b20 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
20b30 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
20b40 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
20b50 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
20b60 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
20b70 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
20b80 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
20b90 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
20ba0 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
20bb0 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
20bc0 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
20bd0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
20be0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
20bf0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
20c00 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
20c10 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
20c20 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
20c30 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
20c40 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
20c50 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
20c60 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
20c70 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
20c80 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
20c90 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
20ca0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
20cb0 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
20cc0 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
20cd0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
20ce0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
20cf0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
20d00 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
20d10 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
20d20 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
20d30 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
20d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
20d70 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
20d80 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
20d90 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
20da0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
20db0 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
20dc0 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
20dd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
20de0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
20df0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
20e00 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
20e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20e20 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
20e30 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
20e40 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
20e50 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
20e60 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
20e70 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
20e80 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
20e90 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
20ea0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
20eb0 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
20ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
20ed0 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
20ee0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
20ef0 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
20f00 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
20f10 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
20f20 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
20f30 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
20f40 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
20f50 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
20f60 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
20f70 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
20f80 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
20f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20fa0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
20fb0 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
20fc0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
20fd0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
20fe0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
20ff0 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
21000 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
21010 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
21020 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
21030 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
21040 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
21050 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
21060 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
21070 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
21080 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
21090 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
210a0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
210c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
210d0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
210e0 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
210f0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
21100 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
21110 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
21120 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
21130 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
21140 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
21150 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
21160 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
21170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21180 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
21190 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
211a0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
211b0 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
211c0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
211d0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
211e0 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
211f0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
21200 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
21210 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
21220 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
21230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21240 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
21250 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
21260 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
21270 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
21280 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
21290 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
212a0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
212b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
212c0 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
212d0 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
212e0 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
212f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
21300 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
21310 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
21320 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
21330 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
21340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
21350 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
21360 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21370 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21380 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
21390 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
213a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
213b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
213c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
213d0 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
213e0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
213f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
21400 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
21410 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
21420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
21430 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
21440 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
21450 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
21460 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
21470 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21480 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21490 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
214a0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
214b0 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
214c0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
214d0 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
214e0 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
214f0 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
21500 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
21510 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
21520 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
21530 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
21540 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
21550 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
21560 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
21570 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
21580 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
21590 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
215a0 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
215b0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
215c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
215d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
215e0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
215f0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
21600 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
21610 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
21620 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
21630 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
21640 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
21650 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
21660 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
21670 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
21680 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
21690 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
216a0 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
216b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
216c0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
216d0 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
216e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
216f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21700 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
21710 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
21720 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
21730 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
21740 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
21750 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
21760 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
21770 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
21780 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
21790 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
217a0 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
217b0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
217c0 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
217d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
217e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
217f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
21800 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
21810 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
21820 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
21830 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
21840 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
21850 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20  urnal(pPg) .    
21860 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
21870 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
21880 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
21890 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
218a0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
218b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
218c0 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
218d0 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
218e0 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
218f0 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
21900 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
21910 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
21920 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
21930 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21940 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
21950 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
21960 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
21970 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  fset = pPager->n
21980 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
21990 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
219a0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
219b0 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
219c0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
219d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
219e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
219f0 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
21a00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
21a10 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
21a20 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
21a30 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
21a40 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
21a50 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
21a60 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
21a70 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
21a80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21aa0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21ab0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
21ac0 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
21ad0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
21ae0 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
21af0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
21b00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21b10 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
21b20 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
21b30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21b40 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
21b50 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
21b60 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
21b70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
21b80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21b90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
21ba0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21bb0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
21bc0 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
21bd0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
21be0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
21bf0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
21c00 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
21c10 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
21c20 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
21c30 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
21c40 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
21c50 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
21c60 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
21c70 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
21c80 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
21c90 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
21ca0 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
21cb0 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
21cc0 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
21cd0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
21ce0 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
21cf0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
21d00 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
21d10 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
21d20 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
21d30 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
21d40 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
21d50 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
21d60 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
21d70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
21d80 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
21d90 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
21da0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
21db0 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
21dc0 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
21dd0 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
21de0 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
21df0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
21e00 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
21e10 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
21e20 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
21e30 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
21e40 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
21e50 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
21e60 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
21e70 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
21e80 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
21e90 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
21ea0 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
21eb0 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
21ec0 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
21ed0 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
21ee0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
21ef0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
21f00 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
21f10 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
21f20 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
21f30 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
21f40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
21f50 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
21f60 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
21f70 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21f80 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
21f90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21fa0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
21fb0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
21fc0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
21fd0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
21fe0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
21ff0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  he doNotSyncSpil
22000 6c 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75  l flag is set du
22010 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
22020 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
22030 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
22040 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
22050 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
22060 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
22070 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
22080 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
22090 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
220a0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
220b0 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
220c0 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
220d0 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
220e0 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
220f0 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
22100 66 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c  flag inhibits al
22110 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
22120 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
22130 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e  hether.  ** or n
22140 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
22150 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
22160 73 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  set during a rol
22170 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  lback..  **.  **
22180 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73   Spilling is als
22190 6f 20 69 6e 68 69 62 69 74 65 64 20 77 68 65 6e  o inhibited when
221a0 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
221b0 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  te..  */.  if( p
221c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
221d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
221e0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
221f0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65  >doNotSpill ) re
22200 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22210 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f    if( pPager->do
22220 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20  NotSyncSpill && 
22230 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
22240 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
22250 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
22260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
22270 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
22280 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
22290 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
222a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
222b0 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
222c0 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
222d0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28   log. */.    if(
222e0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
222f0 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20  e(pPg) ){ .     
22300 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
22310 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20  Page(pPg); .    
22320 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
22330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22340 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
22350 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
22360 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
22370 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
22380 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
22390 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
223a0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
223b0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
223c0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
223d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
223e0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
223f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  ;.      rc = syn
22400 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
22410 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
22420 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 0a 20 20  SQLITE_OK && .  
22430 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e        !(pPager->
22440 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
22450 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
22460 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20  EMORY) &&.      
22470 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76    !(sqlite3OsDev
22480 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
22490 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
224a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
224b0 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29  _APPEND).      )
224c0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
224d0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
224e0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
224f0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
22500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22510 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
22520 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
22530 74 68 69 73 20 70 61 67 65 20 69 73 20 6c 61 72  this page is lar
22540 67 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ger than the cur
22550 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20  rent size of.   
22560 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
22570 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e   image, it may n
22580 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74 65  eed to be writte
22590 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
225a0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69  rnal..    ** Thi
225b0 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
225c0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
225d0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
225e0 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
225f0 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77     ** actually w
22600 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
22610 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
22620 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
22630 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66  * Consider the f
22640 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63  ollowing sequenc
22650 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20  e of events:.   
22660 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47   **.    **   BEG
22670 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c  IN;.    **     <
22680 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a  journal page X>.
22690 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69      **     <modi
226a0 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  fy page X>.    *
226b0 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
226c0 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sp;.    **      
226d0 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73   <shrink databas
226e0 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65  e file to Y page
226f0 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  s>.    **       
22700 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65  pagerStress(page
22710 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52   X).    **     R
22720 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20  OLLBACK TO sp;. 
22730 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
22740 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e  (X>Y), then when
22750 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20   pagerStress is 
22760 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69  called page X wi
22770 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
22780 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  n.    ** out to 
22790 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
227a0 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64  e, but will be d
227b0 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ropped from the 
227c0 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20  cache. Then,.   
227d0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
227e0 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
227f0 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65  p" statement, re
22800 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c  ading page X wil
22810 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61  l read.    ** da
22820 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
22830 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
22840 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
22850 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
22860 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e  .    ** was when
22870 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22880 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73   started, not as
22890 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41   it was when "SA
228a0 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20  VEPOINT sp".    
228b0 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e  ** was executed.
228c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
228d0 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
228e0 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
228f0 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67  ent data for pag
22900 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  e X into the .  
22910 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
22920 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74   file now (if it
22930 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
22940 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20  there), so that 
22950 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  it will.    ** b
22960 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
22970 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
22980 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
22990 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20  CK TO sp" is .  
229a0 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20    ** executed.. 
229b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45     */.    if( NE
229c0 56 45 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d  VER(.        rc=
229d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
229e0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
229f0 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65  dbSize && subjRe
22a00 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a  quiresPage(pPg).
22a10 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72      ) ){.      r
22a20 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
22a30 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
22a40 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
22a50 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
22a60 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
22a70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22a80 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  . */.    if( rc=
22a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22aa0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
22ab0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
22ac0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
22ad0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
22ae0 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
22af0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22b00 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
22b10 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
22b20 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
22b30 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
22b40 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
22b50 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
22b60 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
22b70 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
22b80 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
22b90 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  );.}.../*.** All
22ba0 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
22bb0 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
22bc0 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
22bd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
22be0 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
22bf0 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
22c00 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
22c10 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
22c20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
22c30 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
22c40 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
22c50 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
22c60 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
22c70 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
22c80 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
22c90 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
22ca0 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
22cb0 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
22cc0 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
22cd0 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
22ce0 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
22cf0 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
22d00 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
22d10 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
22d20 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
22d30 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
22d40 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
22d50 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
22d60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
22d70 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
22d80 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
22d90 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
22da0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
22db0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
22dc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
22dd0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
22de0 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
22df0 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
22e00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
22e10 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
22e20 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
22e30 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
22e40 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
22e50 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
22e60 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
22e70 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
22e80 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
22e90 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
22ea0 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
22eb0 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
22ec0 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
22ed0 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
22ee0 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
22ef0 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
22f00 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
22f10 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
22f20 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d   of the PAGER_OM
22f30 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50  IT_JOURNAL and P
22f40 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
22f50 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
22f60 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
22f70 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
22f80 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
22f90 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
22fa0 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
22fb0 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
22fc0 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
22fd0 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
22fe0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
22ff0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
23000 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
23010 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
23020 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
23030 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
23040 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
23050 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
23060 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
23070 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
23080 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
23090 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
230a0 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
230b0 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
230c0 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
230d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
230e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
230f0 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
23100 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
23110 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
23120 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
23130 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
23140 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
23150 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
23160 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
23170 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
23180 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
23190 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
231a0 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
231b0 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
231c0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
231d0 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
231e0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
231f0 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
23200 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
23210 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
23220 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23230 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
23240 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
23250 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
23260 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
23270 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
23280 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
23290 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
232a0 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
232b0 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
232c0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
232d0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs,            /
232e0 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
232f0 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
23300 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
23310 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
23320 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46  t)(DbPage*) /* F
23330 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69  unction to reini
23340 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f  tialize pages */
23350 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
23360 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
23370 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
23380 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
23390 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
233a0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
233b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
233c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
233d0 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
233e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
233f0 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
23400 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
23410 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
23420 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
23430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
23440 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
23450 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
23460 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
23470 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
23480 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
23490 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
234a0 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
234b0 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
234c0 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
234d0 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
234e0 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
234f0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
23500 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
23510 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
23520 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
23530 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
23540 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
23550 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
23560 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
23570 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
23580 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
23590 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
235a0 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
235b0 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61  l */.  int noRea
235c0 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
235d0 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
235e0 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65  CK)!=0;  /* True
235f0 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f   to omit read-lo
23600 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  ck */.  int pcac
23610 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
23620 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
23630 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
23640 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
23650 63 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50  che */.  u16 szP
23660 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
23670 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
23680 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
23690 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  page size */..  
236a0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
236b0 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
236c0 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
236d0 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
236e0 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
236f0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
23700 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
23710 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
23720 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
23730 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
23740 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
23750 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
23760 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
23770 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
23780 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
23790 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
237a0 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
237b0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
237c0 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
237d0 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
237e0 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
237f0 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
23800 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
23810 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
23820 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
23830 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
23840 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
23850 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
23860 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
23870 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
23880 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
23890 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
238a0 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
238b0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
238c0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
238d0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
238e0 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pVfs));.  }else{
238f0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
23900 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
23910 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53  lite3MemJournalS
23920 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ize());.  }..  /
23930 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
23940 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
23950 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
23960 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
23970 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
23980 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
23990 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
239a0 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
239b0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
239c0 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
239d0 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
239e0 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
239f0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
23a00 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
23a10 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
23a20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
23a30 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
23a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
23a50 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
23a60 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50  ame[0] ){.    nP
23a70 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
23a80 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
23a90 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
23aa0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
23ab0 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
23ac0 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
23ad0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
23ae0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
23af0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
23b00 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
23b10 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
23b20 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
23b30 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
23b40 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
23b50 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
23b60 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
23b70 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
23b80 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
23b90 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
23ba0 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
23bb0 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
23bc0 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
23bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23be0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
23bf0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
23c00 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
23c10 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
23c20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
23c30 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
23c40 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
23c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23c60 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
23c70 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
23c80 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
23c90 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
23ca0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
23cb0 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
23cc0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
23cd0 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
23ce0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
23cf0 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
23d00 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
23d10 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
23d20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
23d30 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
23d40 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
23d50 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
23d60 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
23d70 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
23d80 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
23d90 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
23da0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
23db0 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
23dc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23dd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
23de0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
23df0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
23e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23e10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
23e20 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
23e30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23e40 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
23e50 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  te memory for th
23e60 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
23e70 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  e, PCache object
23e80 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65  , the.  ** three
23e90 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
23ea0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
23eb0 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  file name and th
23ec0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
23ed0 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c  file name. The l
23ee0 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20  ayout in memory 
23ef0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  is as follows:. 
23f00 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67   **.  **     Pag
23f10 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  er object       
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
23f30 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65  zeof(Pager) byte
23f40 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63  s).  **     PCac
23f50 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20  he object       
23f60 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
23f70 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
23f80 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23f90 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
23fa0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20  andle           
23fb0 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65   (pVfs->szOsFile
23fc0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23fd0 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   Sub-journal fil
23fe0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
23ff0 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
24000 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
24010 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66    Main journal f
24020 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
24030 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
24040 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
24050 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
24060 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
24070 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20     (nPathname+1 
24080 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
24090 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  Journal file nam
240a0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
240b0 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62  (nPathname+8+1 b
240c0 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74  ytes).  */.  pPt
240d0 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  r = (u8 *)sqlite
240e0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20  3MallocZero(.   
240f0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
24100 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20  pPager)) +      
24110 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
24120 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  re */.    ROUND8
24130 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20  (pcacheSize) +  
24140 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63           /* PCac
24150 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20  he object */.   
24160 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
24170 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20  OsFile) +       
24180 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66  /* The main db f
24190 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ile */.    journ
241a0 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b  alFileSize * 2 +
241b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
241c0 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
241d0 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68  es */ .    nPath
241e0 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20  name + 1 +      
241f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
24200 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50  lename */.    nP
24210 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20  athname + 8 + 1 
24220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24230 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b  zJournal */.  );
24240 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
24250 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
24260 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
24270 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  R(journalFileSiz
24280 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50  e)) );.  if( !pP
24290 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
242a0 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
242b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
242c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
242d0 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
242e0 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
242f0 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
24300 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
24310 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
24320 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
24330 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
24340 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
24350 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
24360 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
24370 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
24380 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
24390 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
243a0 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
243b0 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
243c0 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
243d0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
243e0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
243f0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
24400 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
24410 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
24420 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
24430 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
24440 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
24450 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
24460 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
24470 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
24480 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
24490 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
244a0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
244b0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
244c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
244d0 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
244e0 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
244f0 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65  ame + 1);.    me
24500 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
24510 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
24520 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
24530 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
24540 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
24550 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
24560 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
24570 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
24580 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
24590 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20  urnal", 8);.    
245a0 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  if( pPager->zFil
245b0 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50  ename[0]==0 ) pP
245c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30  ager->zJournal[0
245d0 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
245e0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
245f0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
24600 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
24610 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
24620 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
24630 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
24640 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
24650 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
24660 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26   zFilename[0] &&
24670 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69   !memDb ){.    i
24680 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246a0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
246b0 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
246c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
246d0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
246e0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
246f0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
24700 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
24710 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
24720 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
24730 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
24740 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
24750 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
24760 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
24770 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
24780 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61  .    ** choose a
24790 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
247a0 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61  ze in case we ha
247b0 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  ve to create the
247c0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
247d0 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
247e0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
247f0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
24800 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
24810 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
24820 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
24830 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c   **    + The val
24840 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
24850 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
24860 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b  ze().    **    +
24870 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
24880 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
24890 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
248a0 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  cally..    */.  
248b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
248c0 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
248d0 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63   ){.      setSec
248e0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
248f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51  .      assert(SQ
24900 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
24910 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
24920 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
24930 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28  SIZE);.      if(
24940 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
24950 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
24960 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
24970 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
24980 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
24990 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
249a0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
249b0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
249c0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
249d0 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65  SIZE;.        }e
249e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
249f0 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36  zPageDflt = (u16
24a00 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
24a10 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ize;.        }. 
24a20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
24a30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
24a40 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b  IC_WRITE.      {
24a50 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63  .        int iDc
24a60 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
24a70 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
24a80 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
24a90 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
24aa0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
24ab0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
24ac0 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
24ad0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24ae0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
24af0 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
24b00 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
24b10 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
24b20 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
24b30 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
24b40 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44    for(ii=szPageD
24b50 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  flt; ii<=SQLITE_
24b60 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
24b70 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
24b80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
24b90 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
24ba0 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
24bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24bc0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
24bd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
24bf0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65  endif.    }.  }e
24c00 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
24c10 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
24c20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
24c30 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
24c40 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
24c50 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
24c60 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
24c70 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
24c80 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
24c90 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
24ca0 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
24cb0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
24cc0 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
24cd0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
24ce0 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
24cf0 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
24d00 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
24d10 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
24d20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
24d30 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
24d40 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
24d50 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
24d60 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
24d70 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
24d80 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
24d90 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
24da0 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
24db0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
24dc0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
24dd0 55 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f  USIVE;.    readO
24de0 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
24df0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24e00 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
24e10 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
24e20 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
24e30 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
24e40 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
24e50 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
24e60 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
24e70 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
24e80 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
24e90 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
24ea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24eb0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
24ec0 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
24ed0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
24ee0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
24ef0 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
24f00 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
24f10 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
24f20 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
24f30 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
24f40 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69  r occurred in ei
24f50 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
24f60 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ks above, free t
24f70 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73  he .  ** Pager s
24f80 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
24f90 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
24fa0 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
24fb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
24fc0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54  ert( !pPager->pT
24fd0 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73  mpSpace );.    s
24fe0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
24ff0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
25000 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
25010 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
25020 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  rc;.  }..  /* In
25030 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
25040 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
25050 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
25060 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61  1000 );.  nExtra
25070 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
25080 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
25090 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
250a0 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
250b0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
250c0 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
250d0 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
250e0 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
250f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
25100 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
25110 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
25120 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
25130 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
25140 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
25150 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
25160 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
25170 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
25180 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
25190 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
251a0 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
251b0 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
251c0 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26   = (noReadlock &
251d0 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30  & readOnly) ?1:0
251e0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
251f0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
25200 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
25210 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
25220 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
25230 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
25240 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
25250 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a   (u8)memDb;.  /*
25260 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
25270 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
25280 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
25290 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
252a0 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
252b0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
252c0 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
252d0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
252e0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
252f0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
25300 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
25310 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
25320 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
25330 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
25340 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
25350 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
25360 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
25370 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
25380 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
25390 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
253a0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
253b0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
253c0 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
253d0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
253e0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
253f0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
25400 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
25410 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
25420 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
25430 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
25440 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
25450 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
25460 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
25470 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
25480 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
25490 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
254a0 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
254b0 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
254c0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
254d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  */.  assert( use
254e0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
254f0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
25500 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
25510 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
25520 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
25530 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
25540 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
25550 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
25560 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
25570 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
25580 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
25590 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
255a0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
255b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
255c0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
255d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
255e0 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
255f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
25600 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
25610 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
25620 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
25630 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
25640 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
25650 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
25660 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
25670 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73  ager);.  if( !us
25680 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
25690 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
256a0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
256b0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d  NALMODE_OFF;.  }
256c0 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29  else if( memDb )
256d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
256e0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45  urnalMode = PAGE
256f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
25700 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  MORY;.  }.  /* p
25710 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
25720 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
25730 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
25740 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f  ndlerArg = 0; */
25750 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
25760 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
25770 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
25780 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
25790 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
257a0 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50  sh)); */..  *ppP
257b0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
257c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
257d0 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
257e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
257f0 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
25800 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
25810 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
25820 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
25830 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
25840 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
25850 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
25860 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
25870 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
25880 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
25890 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
258a0 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
258b0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
258c0 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
258d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
258e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
258f0 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
25900 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
25910 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
25920 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
25930 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
25940 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
25950 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
25960 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
25970 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
25980 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
25990 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
259a0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
259b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
259c0 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
259d0 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
259e0 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
259f0 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
25a00 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
25a10 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
25a20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
25a30 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
25a40 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
25a50 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
25a60 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
25a70 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
25a80 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
25a90 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
25aa0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
25ab0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
25ac0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
25ad0 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
25ae0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
25af0 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
25b00 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
25b10 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
25b20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
25b30 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
25b40 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
25b50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
25b60 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
25b70 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
25b80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
25b90 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
25ba0 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
25bb0 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
25bc0 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
25bd0 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
25be0 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
25bf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25c00 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
25c10 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
25c20 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
25c30 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
25c40 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
25c50 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
25c60 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
25c70 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
25c80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25c90 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
25ca0 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
25cb0 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
25cc0 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
25cd0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
25ce0 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
25cf0 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
25d00 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
25d10 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
25d20 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
25d30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
25d40 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
25d50 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
25d60 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
25d70 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
25d80 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
25d90 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
25da0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
25db0 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
25dc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
25dd0 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
25de0 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
25df0 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
25e00 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
25e10 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
25e20 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
25e30 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
25e40 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
25e50 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
25e60 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
25e70 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
25e80 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
25e90 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
25ea0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
25eb0 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
25ec0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
25ed0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
25ee0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
25ef0 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
25f00 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69  t jrnlOpen = !!i
25f10 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25f20 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  d);..  assert( p
25f30 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
25f40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
25f50 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
25f60 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
25f70 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
25f80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25f90 61 74 65 20 3c 3d 20 50 41 47 45 52 5f 53 48 41  ate <= PAGER_SHA
25fa0 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RED );.  assert(
25fb0 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20   jrnlOpen==0 || 
25fc0 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  ( sqlite3OsDevic
25fd0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25fe0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a  (pPager->jfd) &.
25ff0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
26000 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
26010 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20  N_OPEN.  ));..  
26020 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
26030 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
26040 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26050 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
26060 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
26070 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
26080 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
26090 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
260a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
260b0 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  sts ){.    int l
260c0 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20  ocked;          
260d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
260e0 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
260f0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
26100 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  lock */..    /* 
26110 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68  Race condition h
26120 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72  ere:  Another pr
26130 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65  ocess might have
26140 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68   been holding th
26150 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53  e.    ** the RES
26160 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68  ERVED lock and h
26170 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70  ave a journal op
26180 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65  en at the sqlite
26190 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20  3OsAccess() .   
261a0 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20   ** call above, 
261b0 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20  but then delete 
261c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
261d0 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65  drop the lock be
261e0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67  fore.    ** we g
261f0 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  et to the follow
26200 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65  ing sqlite3OsChe
26210 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
26220 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a   call.  If that.
26230 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61      ** is the ca
26240 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
26250 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65   might think the
26260 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
26270 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  nal when.    ** 
26280 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73  in fact there is
26290 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73   none.  This res
262a0 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d  ults in a false-
262b0 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77  positive which w
262c0 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  ill.    ** be de
262d0 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20  alt with by the 
262e0 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65  playback routine
262f0 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
26300 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
26310 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
26320 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
26330 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
26340 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
26350 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
26360 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
26370 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  nPage;..      /*
26380 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20   Check the size 
26390 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
263a0 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73  file. If it cons
263b0 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c  ists of 0 pages,
263c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64  .      ** then d
263d0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
263e0 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20  l file. See the 
263f0 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61  header comment a
26400 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20  bove for .      
26410 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67  ** the reasoning
26420 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74   here.  Delete t
26430 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  he obsolete jour
26440 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20  nal file under. 
26450 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56       ** a RESERV
26460 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64  ED lock to avoid
26470 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
26480 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69   and to avoid vi
26490 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  olating.      **
264a0 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20   [H33020]..     
264b0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
264c0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
264d0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
264e0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
264f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26500 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
26510 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
26520 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
26530 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
26540 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
26550 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
26560 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
26570 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
26580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26590 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
265a0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
265b0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
265c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
265d0 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
265e0 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
265f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26600 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
26610 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
26620 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
26630 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
26640 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
26650 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
26660 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
26670 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
26680 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
26690 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
266a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
266b0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
266c0 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
266d0 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
266e0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
266f0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
26700 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26710 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
26720 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
26730 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
26740 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
26750 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
26760 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
26770 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
26780 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
26790 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
267a0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
267b0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
267c0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
267d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
267e0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
267f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26800 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
26810 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
26820 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
26830 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
26840 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
26850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26860 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
26870 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
26880 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26890 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
268a0 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
268b0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
268c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
268d0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
268e0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
268f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26900 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
26910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26920 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
26930 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
26940 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
26950 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
26960 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
26970 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
26980 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
26990 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
269a0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
269b0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
269c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
269d0 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
269e0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
269f0 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
26a00 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
26a10 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
26a20 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
26a30 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
26a40 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
26a50 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
26a60 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
26a70 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
26a80 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
26a90 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
26aa0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
26ab0 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
26ac0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
26ad0 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
26ae0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
26af0 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
26b00 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
26b10 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
26b20 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
26b30 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
26b40 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
26b50 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
26b60 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
26b70 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
26b80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
26b90 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
26ba0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
26bb0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
26bc0 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
26bd0 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
26be0 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
26bf0 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
26c00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26c10 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
26c20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
26c30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26c40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26c50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26c60 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
26c70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
26c80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
26c90 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
26ca0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
26cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26cc0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
26cd0 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
26ce0 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
26cf0 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
26d00 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
26d10 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
26d20 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
26d30 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
26d40 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
26d50 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
26d60 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
26d70 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
26d80 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
26d90 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
26da0 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
26db0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
26dc0 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
26dd0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
26de0 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
26df0 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e 6f  UNLOCK state (no
26e00 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20   lock held.**   
26e10 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61     on the databa
26e20 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61  se file), then a
26e30 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
26e40 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a  e to obtain a.**
26e50 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63        SHARED loc
26e60 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
26e70 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74  e file. Immediat
26e80 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
26e90 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
26ea0 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
26eb0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20   file-system is 
26ec0 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f  checked for a ho
26ed0 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20  t-journal,.**   
26ee0 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79     which is play
26ef0 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65  ed back if prese
26f00 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e  nt. Following an
26f10 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a  y hot-journal .*
26f20 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c  *      rollback,
26f30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
26f40 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76   the cache are v
26f50 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63  alidated by chec
26f60 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  king.**      the
26f70 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72   'change-counter
26f80 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64  ' field of the d
26f90 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
26fa0 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  der and.**      
26fb0 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65  discarded if the
26fc0 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62  y are found to b
26fd0 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  e invalid..**.**
26fe0 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67     2) If the pag
26ff0 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
27000 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c   exclusive-mode,
27010 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63   and there are c
27020 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
27030 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
27040 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e  references to an
27050 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20  y pages, and is 
27060 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
27070 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e  te,.**      then
27080 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
27090 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65  ade to clear the
270a0 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20   error state by 
270b0 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20  discarding.**   
270c0 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20     the contents 
270d0 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
270e0 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61  e and rolling ba
270f0 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72  ck any open jour
27100 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65  nal.**      file
27110 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
27120 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69 62  peration describ
27130 65 64 20 62 79 20 28 32 29 20 61 62 6f 76 65 20  ed by (2) above 
27140 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
27150 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a 20  , and if the.** 
27160 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65  pager is in an e
27170 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72  rror state other
27180 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c   than SQLITE_FUL
27190 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  L when this is c
271a0 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  alled,.** the er
271b0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
271c0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
271d0 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74 74 65  . It is permitte
271e0 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a 2a  d to read the.**
271f0 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 20 69   database when i
27200 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65 72  n SQLITE_FULL er
27210 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
27220 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65   Otherwise, if e
27230 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
27240 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
27250 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
27260 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72 6f  If an.** IO erro
27270 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c  r occurs while l
27280 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62  ocking the datab
27290 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f  ase, checking fo
272a0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  r a hot-journal.
272b0 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c 69  ** file or rolli
272c0 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
272d0 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
272e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
272f0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
27300 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
27310 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
27320 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
27330 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
27340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27350 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
27360 74 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d  t isErrorReset =
27370 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
27380 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63 6f   /* True if reco
27390 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72 6f  vering from erro
273a0 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a  r state */..  /*
273b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
273c0 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
273d0 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c  m b-tree and onl
273e0 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  y when there are
273f0 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e   no.  ** outstan
27400 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
27410 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
27420 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
27430 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
27440 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  0 );.  if( NEVER
27450 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  (MEMDB && pPager
27460 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65  ->errCode) ){ re
27470 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
27480 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49 66  Code; }..  /* If
27490 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
274a0 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74  s in an error-st
274b0 61 74 65 2c 20 6e 6f 77 20 69 73 20 61 20 63 68  ate, now is a ch
274c0 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20  ance to clear.  
274d0 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69  ** the error. Di
274e0 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
274f0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
27500 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62 61  cache and rollba
27510 63 6b 0a 20 20 2a 2a 20 61 6e 79 20 68 6f 74 20  ck.  ** any hot 
27520 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66  journal in the f
27530 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a 2f  ile-system..  */
27540 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
27550 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  rrCode ){.    if
27560 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
27570 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
27580 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  >zJournal ){.   
27590 20 20 20 69 73 45 72 72 6f 72 52 65 73 65 74 20     isErrorReset 
275a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
275b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
275c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
275d0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
275e0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
275f0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
27600 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  er) ){.    rc = 
27610 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
27620 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
27630 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
27640 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
27650 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73  GER_UNLOCK || is
27660 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20  ErrorReset ){.  
27670 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
27680 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
27690 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69  ger->pVfs;.    i
276a0 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20  nt isHotJournal 
276b0 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
276c0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
276d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
276e0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
276f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
27700 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
27710 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
27720 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27730 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
27740 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
27750 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
27760 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SHARED;.    }els
27770 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
27780 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
27790 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
277a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
277b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
277c0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
277d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
277e0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
277f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27800 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
27810 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  er, rc);.      }
27820 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
27830 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
27840 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
27850 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
27860 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
27870 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
27880 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
27890 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
278a0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
278b0 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
278c0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
278d0 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
278e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
278f0 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b  !isErrorReset ){
27900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27910 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20  Pager->state <= 
27920 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
27930 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
27940 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
27950 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b   &isHotJournal);
27960 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
27970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27980 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
27990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
279a0 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65     if( isErrorRe
279b0 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72  set || isHotJour
279c0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
279d0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
279e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
279f0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
27a00 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
27a10 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
27a20 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
27a30 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
27a40 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
27a50 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
27a60 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
27a70 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
27a80 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
27a90 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
27aa0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
27ab0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
27ac0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
27ad0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
27ae0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
27af0 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
27b00 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
27b10 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
27b20 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
27b30 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
27b40 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
27b50 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
27b60 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
27b70 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
27b80 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
27b90 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
27ba0 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
27bb0 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
27bc0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
27bd0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
27be0 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
27bf0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
27c00 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
27c10 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
27c20 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
27c30 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
27c40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27c50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27c60 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
27c70 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
27c80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27c90 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
27ca0 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
27cb0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
27cc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
27cd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27ce0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
27cf0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
27d00 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
27d10 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
27d20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
27d30 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
27d40 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
27d50 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70   }. .      /* Op
27d60 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
27d70 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
27d80 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
27d90 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
27da0 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
27db0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
27dc0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
27dd0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
27de0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  nd.      ** poss
27df0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
27e00 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
27e10 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
27e20 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
27e30 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29   ** OsTruncate()
27e40 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78   call used in ex
27e50 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
27e60 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65  ode also require
27e70 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61  s.      ** a rea
27e80 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
27e90 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dle..      */.  
27ea0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
27eb0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
27ec0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
27ed0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
27ee0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
27ef0 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  fs,pPager->zJour
27f00 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53  nal,SQLITE_ACCES
27f10 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a  S_EXISTS,&res);.
27f20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
27f30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27f40 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29         if( res )
27f50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
27f60 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
27f70 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
27f80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
27f90 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
27fa0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
27fc0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
27fd0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
27fe0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27ff0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
28000 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
28010 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
28020 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
28030 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
28040 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
28050 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28060 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
28070 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28080 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
28090 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
280a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
280b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
280c0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
280d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
280e0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
280f0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
28100 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
28110 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28120 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
28130 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
28140 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
28150 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
28160 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 74             ** ot
28170 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
28180 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
28190 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
281a0 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
281b0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
281c0 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
281d0 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
281e0 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
281f0 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  it .            
28200 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
28210 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
28220 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
28230 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
28240 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
28250 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61  ion was called a
28260 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
28270 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
28280 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
28290 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
282a0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
282b0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
282c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
282d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
282e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
282f0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
28300 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
28310 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74  ..      /* Reset
28320 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 74 61   the journal sta
28330 74 75 73 20 66 69 65 6c 64 73 20 74 6f 20 69 6e  tus fields to in
28340 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
28350 68 61 76 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a  have no.      **
28360 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
28370 6c 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  l at this time. 
28380 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
28390 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
283a0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
283b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
283c0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
283d0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
283e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
283f0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
28400 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
28410 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  re the journal f
28420 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
28430 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a  ced to disk. */.
28440 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
28450 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
28460 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
28470 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
28480 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
28490 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
284a0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
284b0 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
284c0 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
284d0 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
284e0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
284f0 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
28500 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
28510 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
28520 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20  nt cache.  Sync 
28530 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  the hot journal 
28540 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20  before playing. 
28550 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20       ** it back 
28560 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73  since the proces
28570 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20 61  s that crashed a
28580 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20  nd left the hot 
28590 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
285a0 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f   probably did no
285b0 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65  t sync it and we
285c0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
285d0 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20   always sync.   
285e0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
285f0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
28600 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   it back..      
28610 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f  */.      if( isO
28620 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28630 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
28640 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
28650 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
28660 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28680 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
28690 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
286a0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
286b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
286c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
286d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
286e0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
286f0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
28700 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
28710 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28720 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67     assert( (pPag
28730 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
28740 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
28750 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
28760 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
28770 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
28780 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
28790 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
287a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
287b0 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50  ckup || sqlite3P
287c0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
287d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
287e0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
287f0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
28800 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
28810 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
28820 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
28830 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
28840 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
28850 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
28860 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
28870 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
28880 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
28890 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
288a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
288b0 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
288c0 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
288d0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
288e0 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
288f0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
28900 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
28910 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
28920 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
28930 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
28940 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
28950 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
28960 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
28970 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
28980 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
28990 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
289a0 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
289b0 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
289c0 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
289d0 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
289e0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
289f0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
28a00 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
28a10 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
28a20 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
28a30 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
28a40 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
28a50 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
28a60 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
28a70 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
28a80 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
28a90 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
28aa0 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
28ab0 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
28ac0 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
28ad0 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
28ae0 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
28af0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
28b00 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
28b10 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  0;.      char db
28b20 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
28b30 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
28b40 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  rs)];.      sqli
28b50 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
28b60 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
28b70 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  );..      if( pP
28b80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
28b90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50  .        rc = pP
28ba0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
28bb0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
28bc0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
28bd0 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
28be0 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
28bf0 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
28c00 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
28c10 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
28c20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
28c30 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
28c40 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
28c50 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
28c60 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
28c70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28c90 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
28ca0 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
28cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28cc0 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
28cd0 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
28ce0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
28cf0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
28d00 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
28d10 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
28d20 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
28d30 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
28d40 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
28d50 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
28d60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
28d70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28d80 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
28d90 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  | pPager->state=
28da0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
28db0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
28dc0 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
28dd0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
28de0 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
28df0 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
28e00 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
28e10 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
28e20 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
28e30 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
28e40 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
28e50 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
28e60 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ent(pPager);.  }
28e70 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
28e80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28e90 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75  {.    /* pager_u
28ea0 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  nlock() is a no-
28eb0 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  op for exclusive
28ec0 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d   mode and in-mem
28ed0 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a  ory databases. *
28ee0 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  /.    pager_unlo
28ef0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
28f00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28f10 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  /*.** If the ref
28f20 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73  erence count has
28f30 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72   reached zero, r
28f40 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
28f50 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
28f60 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  n and unlock the
28f70 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78   pager..**.** Ex
28f80 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67  cept, in locking
28f90 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20  _mode=EXCLUSIVE 
28fa0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  when there is no
28fb0 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74  thing to in.** t
28fc0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
28fd0 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20  nal, the unlock 
28fe0 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64  is not performed
28ff0 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a   and there is.**
29000 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c   nothing to roll
29010 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f  back, so this ro
29020 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
29030 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
29040 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55  d pagerUnlockIfU
29050 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61  nused(Pager *pPa
29060 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c  ger){.  if( (sql
29070 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
29080 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
29090 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21  he)==0).   && (!
290a0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
290b0 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
290c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a  >journalOff>0) .
290d0 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e    ){.    pagerUn
290e0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
290f0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
29100 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
29110 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
29120 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
29130 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
29140 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
29150 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
29160 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
29170 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
29180 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
29190 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
291a0 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
291b0 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
291c0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
291d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
291e0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c  ested page is al
291f0 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
29200 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e  he, it is return
29210 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ed. .** Otherwis
29220 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  e, a new page ob
29230 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
29240 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  d and populated 
29250 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61  with data.** rea
29260 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
29270 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d  ase file. In som
29280 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61  e cases, the pca
29290 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a  che module may.*
292a0 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20  * choose not to 
292b0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
292c0 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d  age object and m
292d0 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  ay reuse an exis
292e0 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77  ting.** object w
292f0 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  ith no outstandi
29300 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a  ng references..*
29310 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64  *.** The extra d
29320 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
29330 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
29340 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
29350 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69  zeros the .** fi
29360 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
29370 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
29380 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61  emory. If the pa
29390 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20  ge requested is 
293a0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
293b0 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68  he cache when th
293c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
293d0 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  alled, then the 
293e0 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73  extra.** data is
293f0 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20   left as it was 
29400 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62  when the page ob
29410 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73  ject was last us
29420 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
29430 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
29440 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
29450 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
29460 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e  ge or if a .** n
29470 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
29480 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e   passed as the n
29490 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74  oContent paramet
294a0 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  er and the .** r
294b0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
294c0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
294d0 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
294e0 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
294f0 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
29500 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
29510 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
29520 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
29530 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
29540 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
29550 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  . .**.** If noCo
29560 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
29570 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
29580 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
29590 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
295a0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  * of the page. T
295b0 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
295c0 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61  o seperate scena
295d0 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
295e0 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
295f0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
29600 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
29610 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
29620 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
29630 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
29640 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
29650 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
29660 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
29670 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
29680 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
29690 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
296a0 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
296b0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
296c0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
296d0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
296e0 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
296f0 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
29700 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
29710 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
29720 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
29730 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
29740 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
29750 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
29760 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
29770 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
29780 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
29790 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
297a0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
297b0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
297c0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
297d0 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
297e0 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
297f0 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
29800 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
29810 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
29820 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
29830 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
29840 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
29850 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
29860 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
29870 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
29880 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
29890 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
298a0 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
298b0 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
298c0 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
298d0 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
298e0 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
298f0 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
29900 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
29910 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
29920 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
29930 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
29940 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
29950 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
29960 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
29970 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
29980 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
29990 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
299a0 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
299b0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
299c0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
299d0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
299e0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
299f0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
29a00 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
29a10 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
29a20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
29a30 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
29a40 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
29a50 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
29a60 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
29a70 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
29a80 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
29a90 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
29aa0 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
29ab0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
29ac0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
29ad0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
29ae0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
29af0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
29b00 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
29b10 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
29b20 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
29b30 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
29b40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
29b50 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
29b60 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
29b70 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
29b80 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
29b90 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
29ba0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29bb0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
29bc0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
29bd0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
29be0 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f  other reading co
29bf0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20  ntent from disk 
29c00 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
29c10 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
29c20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
29c30 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
29c40 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
29c50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29c60 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c  >state>PAGER_UNL
29c70 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  OCK );..  if( pg
29c80 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
29c90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
29ca0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
29cb0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
29cc0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
29cd0 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
29ce0 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
29cf0 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
29d00 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
29d10 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
29d20 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
29d30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
29d40 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
29d50 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
29d60 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
29d70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
29d80 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
29d90 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
29da0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
29db0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
29dc0 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50  he, pgno, 1, ppP
29dd0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
29de0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29df0 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
29e00 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
29e10 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
29e20 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
29e30 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
29e40 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
29e50 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
29e60 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
29e70 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
29e80 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
29e90 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
29ea0 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
29eb0 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
29ec0 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
29ed0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
29ee0 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
29ef0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
29f00 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
29f10 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
29f20 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ge)->pPager==pPa
29f30 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  ger || (*ppPage)
29f40 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
29f50 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
29f60 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
29f70 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
29f80 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
29f90 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
29fa0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
29fb0 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
29fc0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
29fd0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
29fe0 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
29ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2a000 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
2a010 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
2a020 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
2a030 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e   );.    PAGER_IN
2a040 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
2a050 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2a060 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
2a070 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
2a080 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
2a090 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
2a0a0 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
2a0b0 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
2a0c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a   initialized.  *
2a0d0 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  /.    int nMax;.
2a0e0 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
2a0f0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
2a100 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
2a110 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  e;.    pPg->pPag
2a120 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
2a130 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
2a140 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
2a150 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
2a160 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
2a170 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d   page.    ** num
2a180 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
2a190 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e   this, or the un
2a1a0 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67  used locking-pag
2a1b0 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  e, is requested.
2a1c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
2a1d0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
2a1e0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
2a1f0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
2a200 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2a210 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2a220 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
2a230 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
2a240 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
2a250 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2a260 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
2a270 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Max);.    if( rc
2a280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a290 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
2a2a0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
2a2b0 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44   }..    if( MEMD
2a2c0 42 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70  B || nMax<(int)p
2a2d0 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  gno || noContent
2a2e0 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
2a2f0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
2a300 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
2a310 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
2a320 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a330 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f  FULL;.        go
2a340 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
2a350 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
2a360 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
2a370 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
2a380 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
2a390 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
2a3a0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
2a3b0 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
2a3c0 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65          ** It me
2a3d0 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  rely means that 
2a3e0 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65  we might do some
2a3f0 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a   extra work to j
2a400 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20  ournal a .      
2a410 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64    ** page that d
2a420 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2a430 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e  be journaled.  N
2a440 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20  evertheless, be 
2a450 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  sure .        **
2a460 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
2a470 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63  e where a malloc
2a480 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2a490 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65  ile trying to se
2a4a0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  t .        ** a 
2a4b0 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63  bit in a bit vec
2a4c0 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
2a4d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2a4e0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
2a4f0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
2a500 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
2a510 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
2a520 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
2a530 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
2a540 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
2a550 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
2a560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
2a570 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
2a580 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2a590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
2a5a0 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
2a5b0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
2a5c0 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
2a5d0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2a5e0 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
2a5f0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2a600 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
2a610 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2a620 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
2a630 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
2a640 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
2a650 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
2a660 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
2a670 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
2a680 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2a690 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
2a6a0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
2a6b0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
2a6c0 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
2a6d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a6e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a6f0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
2a700 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
2a710 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2a720 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
2a730 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
2a740 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
2a750 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
2a760 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2a770 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f  LITE_OK;..pager_
2a780 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61  acquire_err:.  a
2a790 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2a7a0 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  E_OK );.  if( pP
2a7b0 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
2a7c0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
2a7d0 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f  .  }.  pagerUnlo
2a7e0 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65  ckIfUnused(pPage
2a7f0 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d  r);..  *ppPage =
2a800 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
2a810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
2a820 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
2a830 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2a840 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2a850 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
2a860 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
2a870 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
2a880 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
2a890 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
2a8a0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
2a8b0 69 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20  in cache. Also, 
2a8c0 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20  return 0 if the 
2a8d0 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
2a8e0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
2a8f0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
2a900 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2a910 0a 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61  .** or if the pa
2a920 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72  ger is in an err
2a930 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74  or state other t
2a940 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e  han SQLITE_FULL.
2a950 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2a960 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2a970 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
2a980 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2a990 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
2a9a0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
2a9b0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
2a9c0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
2a9d0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
2a9e0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
2a9f0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
2aa00 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
2aa10 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
2aa20 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
2aa30 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
2aa40 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
2aa50 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
2aa60 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
2aa70 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
2aa80 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
2aa90 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
2aaa0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
2aab0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
2aac0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
2aad0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
2aae0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
2aaf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ab00 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a  ->pPCache!=0 );.
2ab10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ab20 2d 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f  ->state > PAGER_
2ab30 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69  UNLOCK );.  sqli
2ab40 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
2ab50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
2ab60 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
2ab70 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
2ab80 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
2ab90 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
2aba0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
2abb0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2abc0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
2abd0 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
2abe0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
2abf0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
2ac00 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
2ac10 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
2ac20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
2ac30 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
2ac40 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
2ac50 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
2ac60 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
2ac70 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
2ac80 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2ac90 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
2aca0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
2acb0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2acc0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2acd0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2ace0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
2acf0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
2ad00 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
2ad10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2ad20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ad30 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
2ad40 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
2ad50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
2ad60 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
2ad70 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
2ad80 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
2ad90 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2ada0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
2adb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2adc0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
2add0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2ade0 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
2adf0 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
2ae00 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
2ae10 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
2ae20 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
2ae30 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
2ae40 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
2ae50 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
2ae60 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
2ae70 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
2ae80 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
2ae90 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
2aea0 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
2aeb0 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
2aec0 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
2aed0 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
2aee0 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
2aef0 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
2af00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
2af10 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
2af20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
2af30 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
2af40 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
2af50 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
2af60 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
2af70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
2af80 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
2af90 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
2afa0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
2afb0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
2afc0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
2afd0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
2afe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2aff0 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
2b000 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
2b010 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
2b020 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
2b030 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
2b040 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
2b050 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
2b060 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2b070 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
2b080 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
2b090 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
2b0a0 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
2b0b0 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
2b0c0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
2b0d0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2b0e0 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
2b0f0 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
2b100 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
2b110 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2b120 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
2b130 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2b140 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b150 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b170 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2b180 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b1b0 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
2b1c0 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74   file */.  sqlit
2b1d0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
2b1e0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
2b1f0 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
2b200 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
2b210 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
2b220 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2b230 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2b240 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2b250 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2b260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2b270 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2b280 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2b290 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73  ODE_OFF );.  ass
2b2a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
2b2b0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
2b2c0 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
2b2d0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2b2e0 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
2b2f0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  on is a no-op.  
2b300 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20  But on.  ** the 
2b310 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73  other hand, this
2b320 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
2b330 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61  r called if we a
2b340 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20  re already in.  
2b350 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  ** an error stat
2b360 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  e. */.  if( NEVE
2b370 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2b380 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  e) ) return pPag
2b390 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
2b3a0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2b3b0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30  ->dbSizeValid==0
2b3c0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2b3d0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
2b3e0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
2b3f0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2b400 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
2b410 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
2b420 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
2b430 74 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  te(nPage);.  if(
2b440 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2b450 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  nal==0 ){.    re
2b460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b470 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  M;.  }..  /* Ope
2b480 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2b490 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
2b4a0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
2b4b0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2b4c0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2b4d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2b4e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2b4f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2b500 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71  MORY ){.      sq
2b510 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
2b520 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2b530 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b540 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
2b550 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
2b560 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2b570 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
2b580 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
2b590 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
2b5a0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
2b5b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
2b5c0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
2b5d0 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
2b5e0 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
2b5f0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
2b600 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
2b610 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
2b620 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
2b630 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a  N_MAIN_JOURNAL).
2b640 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65          );.#ifde
2b650 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2b660 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2b670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2b680 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
2b690 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
2b6a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
2b6b0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
2b6c0 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
2b6d0 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29  (pPager).      )
2b6e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
2b6f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2b700 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2b710 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2b720 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
2b730 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2b740 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2b750 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2b760 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2b770 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69  ;.  }...  /* Wri
2b780 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
2b790 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
2b7a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b7b0 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74  and open .  ** t
2b7c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
2b7d0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
2b7e0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2b7f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
2b800 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
2b810 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
2b820 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
2b830 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2b840 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
2b850 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
2b860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2b870 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
2b880 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
2b890 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
2b8a0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
2b8b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2b8c0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Off = 0;.    pPa
2b8d0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
2b8e0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
2b8f0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
2b900 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
2b910 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
2b920 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
2b930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b940 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
2b950 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
2b960 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
2b970 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2b980 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  al = 0;.  }.  re
2b990 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b9a0 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
2b9b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
2b9c0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
2b9d0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
2b9e0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
2b9f0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2ba00 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
2ba10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2ba20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
2ba30 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
2ba40 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
2ba50 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
2ba60 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
2ba70 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
2ba80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
2ba90 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
2baa0 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
2bab0 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
2bac0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
2bad0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
2bae0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
2baf0 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
2bb00 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
2bb10 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
2bb20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
2bb30 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
2bb40 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74  mory file and, t
2bb50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2bb60 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66  is .** opened if
2bb70 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   it has not been
2bb80 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20   already. For a 
2bb90 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20  temporary file, 
2bba0 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20  the opening .** 
2bbb0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2bbc0 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
2bbd0 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
2bbe0 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  n actual need to
2bbf0 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68   .** write to th
2bc00 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a  e journal. TODO:
2bc10 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70   Why handle temp
2bc20 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66  orary files diff
2bc30 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49  erently?.**.** I
2bc40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2bc50 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72  le is opened (or
2bc60 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
2bc70 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a  y open), then a.
2bc80 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  ** journal-heade
2bc90 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  r is written to 
2bca0 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
2bcb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
2bcc0 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
2bcd0 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
2bce0 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
2bcf0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
2bd00 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
2bd10 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
2bd20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
2bd30 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
2bd40 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
2bd50 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
2bd60 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
2bd70 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
2bd80 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
2bd90 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
2bda0 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
2bdb0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
2bdc0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
2bdd0 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
2bde0 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
2bdf0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
2be00 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
2be10 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
2be20 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
2be30 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
2be40 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
2be50 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2be60 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
2be70 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
2be80 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
2be90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2bea0 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
2beb0 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
2bec0 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
2bed0 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
2bee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
2bef0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2bf00 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
2bf10 4b 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  K );.  pPager->s
2bf20 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
2bf30 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
2bf40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
2bf50 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
2bf60 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
2bf70 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2bf80 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
2bf90 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26  ssert( !MEMDB &&
2bfa0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
2bfb0 6c 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  le );..    if( p
2bfc0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2bfd0 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
2bfe0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
2bff0 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
2c000 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
2c010 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
2c020 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
2c030 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
2c040 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
2c050 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
2c060 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
2c070 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2c080 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2c090 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
2c0a0 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
2c0b0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
2c0c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
2c0d0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
2c0e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
2c0f0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
2c100 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
2c110 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
2c120 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  D;.        if( r
2c130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c140 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2c150 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2c160 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
2c170 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
2c180 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b  Pager->pWal, 1);
2c190 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2c1a0 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74  /* Grab the writ
2c1b0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f  e lock on the lo
2c1c0 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
2c1d0 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74  ssful, upgrade t
2c1e0 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52  o.      ** PAGER
2c1f0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
2c200 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
2c210 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
2c220 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
2c230 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73        ** The bus
2c240 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74  y-handler is not
2c250 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74   invoked if anot
2c260 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  her connection a
2c270 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20  lready.      ** 
2c280 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d  holds the write-
2c290 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c  lock. If possibl
2c2a0 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  e, the upper lay
2c2b0 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e  er will call it.
2c2c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2c2d0 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73  ** WAL mode sets
2c2e0 20 50 61 67 65 72 2e 73 74 61 74 65 20 74 6f 20   Pager.state to 
2c2f0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 77  PAGER_RESERVED w
2c300 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
2c310 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  en.      ** tran
2c320 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
2c330 65 72 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  er to PAGER_EXCL
2c340 55 53 49 56 45 2e 20 54 68 69 73 20 69 73 20 62  USIVE. This is b
2c350 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
2c360 20 2a 2a 20 50 41 47 45 52 5f 45 58 43 4c 55 53   ** PAGER_EXCLUS
2c370 49 56 45 20 73 74 61 74 65 20 74 68 65 20 63 6f  IVE state the co
2c380 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
2c390 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
2c3a0 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ctions.      ** 
2c3b0 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
2c3c0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
2c3d0 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
2c3e0 62 61 73 65 20 66 69 6c 65 20 61 73 20 77 65 6c  base file as wel
2c3f0 6c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 6e  l.      ** as in
2c400 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
2c410 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
2c420 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 57  e incorrect in W
2c430 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a  AL mode..      *
2c440 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2c450 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
2c460 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
2c470 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
2c480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c490 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2c4a0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2c4b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
2c4c0 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  ze;.        pPag
2c4d0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2c4e0 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
2c4f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2c500 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
2c510 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
2c520 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2c530 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
2c540 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
2c550 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
2c560 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2c570 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
2c580 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
2c590 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c5a0 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
2c5b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
2c5c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c5d0 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
2c5e0 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
2c5f0 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
2c600 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
2c610 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
2c620 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2c630 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
2c640 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
2c650 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
2c660 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
2c670 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
2c680 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
2c690 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
2c6a0 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
2c6b0 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
2c6c0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2c6d0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
2c6e0 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
2c6f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
2c700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c710 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2c720 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2c730 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
2c740 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
2c750 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c760 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
2c770 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
2c780 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
2c790 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c7a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e    }..    /* No n
2c7b0 65 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  eed to open the 
2c7c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
2c7d0 74 68 69 73 20 74 69 6d 65 2e 20 20 49 74 20 77  this time.  It w
2c7e0 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70  ill be.    ** op
2c7f0 65 6e 65 64 20 62 65 66 6f 72 65 20 69 74 20 69  ened before it i
2c800 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 49  s written to.  I
2c810 66 20 77 65 20 64 65 66 65 72 20 6f 70 65 6e 69  f we defer openi
2c820 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a  ng the journal,.
2c830 20 20 20 20 2a 2a 20 77 65 20 6d 69 67 68 74 20      ** we might 
2c840 73 61 76 65 20 74 68 65 20 77 6f 72 6b 20 6f 66  save the work of
2c850 20 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65   creating a file
2c860 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
2c870 69 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20  ion.    ** ends 
2c880 75 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70  up being a no-op
2c890 2e 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  ..    */..    if
2c8a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c8b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2c8c0 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
2c8d0 66 69 65 64 20 29 3b 0a 20 20 20 20 20 20 2f 2a  fied );.      /*
2c8e0 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65   Ignore any IO e
2c8f0 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 73  rror that occurs
2c900 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 65 6e   within pager_en
2c910 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 2e  d_transaction().
2c920 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 75   The.      ** pu
2c930 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61  rpose of this ca
2c940 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74  ll is to reset t
2c950 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
2c960 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20  e of the pager. 
2c970 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74       ** sub-syst
2c980 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d  em. It doesn't m
2c990 61 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75  atter if the jou
2c9a0 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
2c9b0 20 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 20 20   properly.      
2c9c0 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74 20  ** finalized at 
2c9d0 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e 63  this point (sinc
2c9e0 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61  e it is not a va
2c9f0 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
2ca00 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 20 20   anyway)..      
2ca10 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  */.      pager_e
2ca20 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
2ca30 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
2ca40 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2ca50 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
2ca60 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2ca70 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74  pPager)));.  ret
2ca80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ca90 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
2caa0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
2cab0 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
2cac0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2cad0 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
2cae0 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
2caf0 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
2cb00 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
2cb10 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
2cb20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
2cb30 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
2cb40 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
2cb50 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
2cb60 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
2cb70 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
2cb80 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
2cb90 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
2cba0 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
2cbb0 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
2cbc0 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
2cbd0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
2cbe0 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
2cbf0 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
2cc00 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2cc10 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2cc20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2cc30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cc40 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
2cc50 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
2cc60 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72 61  led unless a tra
2cc70 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
2cc80 65 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73  eady been.  ** s
2cc90 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  tarted..  */.  a
2cca0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2ccb0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
2ccc0 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
2ccd0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65   an error has be
2cce0 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65  en previously de
2ccf0 74 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74  tected, report t
2cd00 68 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20  he same error.  
2cd10 2a 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  ** again..  */. 
2cd20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2cd30 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72  r->errCode) )  r
2cd40 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2cd50 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67  rCode;..  /* Hig
2cd60 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her-level routin
2cd70 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  es never call th
2cd80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64  is function if d
2cd90 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20  atabase is not. 
2cda0 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42   ** writable.  B
2cdb0 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c  ut check anyway,
2cdc0 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74   just for robust
2cdd0 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  ness. */.  if( N
2cde0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61  EVER(pPager->rea
2cdf0 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20  dOnly) ) return 
2ce00 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20  SQLITE_PERM;..  
2ce10 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2ce20 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
2ce30 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
2ce40 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  ;..  /* Mark the
2ce50 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
2ce60 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
2ce70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
2ce80 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
2ce90 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
2cea0 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
2ceb0 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
2cec0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2ced0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
2cee0 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  f( pageInJournal
2cef0 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65  (pPg) && !subjRe
2cf00 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
2cf10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
2cf20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2cf30 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  er) );.    pPage
2cf40 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
2cf50 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
2cf60 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
2cf70 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
2cf80 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
2cf90 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
2cfa0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
2cfb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
2cfc0 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
2cfd0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
2cfe0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
2cff0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67     **.    ** Hig
2d000 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
2d010 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
2d020 6c 72 65 61 64 79 20 73 74 61 72 74 65 64 20 61  lready started a
2d030 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
2d040 20 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73    ** which means
2d050 20 74 68 65 79 20 68 61 76 65 20 61 63 71 75 69   they have acqui
2d060 72 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  red the necessar
2d070 79 20 6c 6f 63 6b 73 20 62 75 74 20 74 68 65 20  y locks but the 
2d080 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  rollback.    ** 
2d090 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
2d0a0 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t yet be open.. 
2d0b0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2d0c0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
2d0d0 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67  (pPager, 0, pPag
2d0e0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
2d0f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d120 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
2d130 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
2d140 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
2d150 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2d160 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2d170 4f 46 46 20 0a 20 20 20 20 20 26 26 20 21 70 61  OFF .     && !pa
2d180 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2d190 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61  ).    ){.      a
2d1a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2d1b0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
2d1c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
2d1d0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
2d1e0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
2d1f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
2d200 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2d210 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
2d220 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
2d230 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
2d240 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
2d250 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
2d260 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
2d270 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
2d280 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
2d290 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
2d2a0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
2d2b0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
2d2c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
2d2d0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
2d2e0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
2d2f0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
2d300 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
2d310 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
2d320 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
2d330 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
2d340 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
2d350 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
2d360 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67       if( pPg->pg
2d370 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
2d380 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
2d390 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
2d3a0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
2d3b0 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  2;..        /* W
2d3c0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
2d3d0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
2d3e0 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
2d3f0 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
2d400 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
2d410 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
2d420 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
2d430 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
2d440 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
2d450 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
2d460 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
2d470 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
2d480 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
2d490 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d4a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d4b0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
2d4c0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
2d4d0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2d4e0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
2d4f0 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
2d500 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
2d510 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63  ata2);.        c
2d520 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
2d530 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
2d540 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
2d550 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
2d560 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
2d570 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d580 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
2d590 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2d5a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d5b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d5c0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2d5d0 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
2d5e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2d5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d610 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d620 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20  f + 4);.        
2d630 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2d640 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
2d650 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20  pageSize+4;.    
2d660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2d670 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2d680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2d690 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2d6a0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
2d6b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63  r->journalOff, c
2d6c0 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
2d6d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d6e0 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20  Off += 4;.      
2d6f0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
2d700 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
2d710 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
2d720 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
2d730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d740 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2d750 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
2d760 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  geSize));.      
2d770 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
2d780 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2d790 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
2d7a0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a    PAGERTRACE(("J
2d7b0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
2d7c0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
2d7d0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
2d7e0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
2d7f0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2d800 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
2d810 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
2d820 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2d830 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
2d840 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
2d850 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20          /* Even 
2d860 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
2d870 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
2d880 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  red while journa
2d890 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  lling the.      
2d8a0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
2d8b0 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
2d8c0 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
2d8d0 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
2d8e0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  e..        ** Ot
2d8f0 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
2d900 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2d910 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
2d920 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20  e logic in.     
2d930 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f     ** playback_o
2d940 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74  ne_page() will t
2d950 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61  hink that the pa
2d960 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ge needs to be r
2d970 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20  estored.        
2d980 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
2d990 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
2d9a0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2d9b0 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
2d9c0 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
2d9d0 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
2d9e0 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20  y follow..      
2d9f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2da00 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
2da10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
2da20 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
2da30 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
2da40 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
2da50 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2da60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2da70 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
2da80 6f 63 63 75 72 72 65 64 20 77 72 69 74 69 6e 67  occurred writing
2da90 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2daa0 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
2dab0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
2dac0 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64  n will be rolled
2dad0 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79   back by the lay
2dae0 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  er above..      
2daf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2db00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2db10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2db20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2db30 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ..        pPager
2db40 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
2db50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2db60 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
2db70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2db80 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
2db90 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2dba0 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
2dbb0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2dbc0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
2dbd0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61  MEM );.        a
2dbe0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2dbf0 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
2dc00 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
2dc10 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53      rc |= addToS
2dc20 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
2dc30 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
2dc40 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
2dc50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2dc60 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2dc70 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
2dc80 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  MEM );.         
2dc90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2dca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2dcb0 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e{.        if( !
2dcc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2dcd0 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
2dce0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2dcf0 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
2dd00 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
2dd10 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
2dd20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2dd30 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2dd40 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
2dd50 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE(("APPEND %d p
2dd60 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
2dd70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2dd80 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
2dd90 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2dda0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
2ddb0 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
2ddc0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
2ddd0 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a  1:0)));.      }.
2dde0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2ddf0 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
2de00 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
2de10 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
2de20 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
2de30 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
2de40 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
2de50 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
2de60 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
2de70 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
2de80 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
2de90 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
2dea0 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
2deb0 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
2dec0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
2ded0 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
2dee0 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
2def0 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
2df00 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
2df10 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2df20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
2df30 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
2df40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
2df50 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
2df60 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75  se size and retu
2df70 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rn..  */.  asser
2df80 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2df90 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
2dfa0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2dfb0 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
2dfc0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2dfd0 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
2dfe0 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
2dff0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
2e000 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
2e010 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
2e020 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
2e030 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
2e040 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
2e050 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
2e060 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
2e070 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
2e080 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
2e090 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
2e0a0 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
2e0b0 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
2e0c0 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
2e0d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2e0e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
2e0f0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
2e100 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
2e110 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
2e120 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
2e130 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
2e140 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
2e150 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
2e160 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
2e170 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
2e180 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
2e190 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
2e1a0 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
2e1b0 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
2e1c0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
2e1d0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2e1e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
2e1f0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2e200 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2e210 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
2e220 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
2e230 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2e240 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
2e250 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
2e260 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
2e270 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2e280 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
2e290 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
2e2a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e2b0 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
2e2c0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
2e2d0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
2e2e0 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
2e2f0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
2e300 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
2e310 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
2e320 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e  eSize);..  if( n
2e330 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
2e340 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
2e350 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
2e360 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2e370 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
2e380 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2e390 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
2e3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2e3b0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
2e3c0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
2e3d0 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
2e3e0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b    int nPage = 0;
2e3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e400 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
2e410 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
2e420 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
2e430 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2e440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2e450 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2e460 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
2e470 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
2e480 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20  rue if any page 
2e490 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  has PGHDR_NEED_S
2e4a0 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  YNC */..    /* S
2e4b0 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
2e4c0 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e  Spill flag to 1.
2e4d0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
2e4e0 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
2e4f0 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  .    ** a journa
2e500 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  l header to be w
2e510 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
2e520 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
2e530 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69  ed by.    ** thi
2e540 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
2e550 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
2e560 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
2e570 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
2e580 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29  otSyncSpill==0 )
2e590 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
2e5a0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a  NotSyncSpill++;.
2e5b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
2e5c0 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
2e5d0 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
2e5e0 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
2e5f0 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
2e600 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
2e610 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
2e620 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
2e630 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
2e640 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
2e650 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
2e660 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
2e670 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
2e680 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
2e690 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
2e6a0 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
2e6b0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
2e6c0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2e6d0 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a  t(pPager, (int *
2e6e0 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20  )&nPageCount);. 
2e6f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
2e710 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
2e720 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
2e730 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
2e740 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
2e750 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
2e760 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
2e770 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
2e780 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67   ){.        nPag
2e790 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
2e7a0 2d 70 67 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -pg1;.      }els
2e7b0 65 7b 0a 20 20 20 20 20 20 20 20 6e 50 61 67 65  e{.        nPage
2e7c0 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
2e7d0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
2e7e0 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
2e7f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
2e800 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
2e810 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 67        assert((pg
2e820 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
2e830 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  no);.    }..    
2e840 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
2e850 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
2e860 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
2e870 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
2e880 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
2e890 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if
2e8a0 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  ( pg==pPg->pgno 
2e8b0 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  || !sqlite3Bitve
2e8c0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
2e8d0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b  nJournal, pg) ){
2e8e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
2e8f0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
2e900 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
2e910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e920 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2e930 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
2e940 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2e950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2e960 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
2e970 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
2e980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2e990 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
2e9a0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
2e9b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e9c0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
2e9e0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
2e9f0 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
2ea00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ea10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2ea20 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
2ea30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2ea40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2ea50 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  (pPage = pager_l
2ea60 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
2ea70 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
2ea80 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67   if( pPage->flag
2ea90 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2eaa0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  C ){.          n
2eab0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
2eac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
2ead0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2eae0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
2eaf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2eb00 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  f the PGHDR_NEED
2eb10 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65  _SYNC flag is se
2eb20 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65  t for any of the
2eb30 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20   nPage pages .  
2eb40 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
2eb50 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65   pg1, then it ne
2eb60 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f  eds to be set fo
2eb70 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42  r all of them. B
2eb80 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72  ecause.    ** wr
2eb90 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20  iting to any of 
2eba0 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65  these nPage page
2ebb0 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65  s may damage the
2ebc0 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20   others, the.   
2ebd0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
2ebe0 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79   must contain sy
2ebf0 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66  nc()ed copies of
2ec00 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20   all of them.   
2ec10 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f   ** before any o
2ec20 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72  f them can be wr
2ec30 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
2ec40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2ec50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2ec60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ec70 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
2ec80 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2ec90 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
2eca0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  nc==0 );.      f
2ecb0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
2ecc0 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
2ecd0 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d    PgHdr *pPage =
2ece0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
2ecf0 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20  ager, pg1+ii);. 
2ed00 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2ed10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
2ed20 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  age->flags |= PG
2ed30 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
2ed40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ed50 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
2ed60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2ed70 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2ed80 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
2ed90 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nc);.    }..    
2eda0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2edb0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d  doNotSyncSpill==
2edc0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
2edd0 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d  >doNotSyncSpill-
2ede0 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
2edf0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2ee00 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
2ee10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2ee20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2ee30 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
2ee40 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
2ee50 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
2ee60 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
2ee70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ee80 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
2ee90 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
2eea0 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
2eeb0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
2eec0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
2eed0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
2eee0 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
2eef0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2ef00 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
2ef10 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61   return pPg->fla
2ef20 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a  gs&PGHDR_DIRTY;.
2ef30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2ef40 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
2ef50 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
2ef60 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
2ef70 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
2ef80 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
2ef90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
2efa0 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20  age pPg back to 
2efb0 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
2efc0 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
2efd0 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
2efe0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68  ed as dirty.  Th
2eff0 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
2f000 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a  example, when.**
2f010 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
2f020 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65  en added as a le
2f030 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  af of the freeli
2f040 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a  st and so its.**
2f050 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67   content no long
2f060 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a  er matters..**.*
2f070 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
2f080 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
2f090 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
2f0a0 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
2f0b0 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
2f0c0 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
2f0d0 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72  nused. The pager
2f0e0 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
2f0f0 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
2f100 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
2f110 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
2f120 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
2f130 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
2f140 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
2f150 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
2f160 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a  peed of large .*
2f170 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  * DELETE operati
2f180 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ons..*/.void sql
2f190 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
2f1a0 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
2f1b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2f1c0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2f1d0 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73   if( (pPg->flags
2f1e0 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26  &PGHDR_DIRTY) &&
2f1f0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2f200 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41  int==0 ){.    PA
2f210 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f  GERTRACE(("DONT_
2f220 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
2f230 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
2f240 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
2f250 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  r)));.    IOTRAC
2f260 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
2f270 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
2f280 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d  >pgno)).    pPg-
2f290 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
2f2a0 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64  DONT_WRITE;.#ifd
2f2b0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
2f2c0 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
2f2d0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
2f2e0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
2f2f0 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
2f300 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2f310 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
2f320 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
2f330 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f340 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65   file .** change
2f350 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64  -counter, stored
2f360 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67   as a 4-byte big
2f370 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
2f380 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20  starting at .** 
2f390 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f  byte offset 24 o
2f3a0 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
2f3b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
2f3c0 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
2f3d0 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
2f3e0 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63  his is done by c
2f3f0 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
2f400 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
2f410 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d  n page 1, then m
2f420 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e  odifying the con
2f430 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
2f440 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68  page data. In th
2f450 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65  is case the file
2f460 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
2f470 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
2f480 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
2f490 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
2f4a0 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63  *.** The isDirec
2f4b0 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f  tMode flag may o
2f4c0 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  nly be non-zero 
2f4d0 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77  if the library w
2f4e0 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77  as compiled.** w
2f4f0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45  ith the SQLITE_E
2f500 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2f510 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  TE macro defined
2f520 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2f530 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69  ** if isDirect i
2f540 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2f550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f560 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69  le is updated di
2f570 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69  rectly.** by wri
2f580 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20  ting an updated 
2f590 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
2f5a0 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  1 using a call t
2f5b0 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  o the .** sqlite
2f5c0 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74  3OsWrite() funct
2f5d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2f5e0 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
2f5f0 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
2f600 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
2f610 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20  sDirectMode){.  
2f620 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2f630 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72  OK;..  /* Declar
2f640 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
2f650 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65   constant intege
2f660 72 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66  r 'isDirect'. If
2f670 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63   the.  ** atomic
2f680 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2f690 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69  ion is enabled i
2f6a0 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68  n this build, th
2f6b0 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a  en isDirect.  **
2f6c0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
2f6d0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
2f6e0 73 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72  sed as the isDir
2f6f0 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  ectMode paramete
2f700 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66  r.  ** to this f
2f710 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69  unction. Otherwi
2f720 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73  se, it is always
2f730 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20   set to zero..  
2f740 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61  **.  ** The idea
2f750 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20   is that if the 
2f760 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2f770 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74  imization is not
2f780 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74  .  ** enabled at
2f790 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
2f7a0 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20  he compiler can 
2f7b0 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f  omit the tests o
2f7c0 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74  f.  ** 'isDirect
2f7d0 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c  ' below, as well
2f7e0 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e   as the block en
2f7f0 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20  closed in the.  
2f800 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74  ** "if( isDirect
2f810 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20   )" condition.. 
2f820 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2f830 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2f840 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20  _WRITE.# define 
2f850 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20  DIRECT_MODE 0.  
2f860 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74  assert( isDirect
2f870 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  Mode==0 );.  UNU
2f880 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
2f890 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c  DirectMode);.#el
2f8a0 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45  se.# define DIRE
2f8b0 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74  CT_MODE isDirect
2f8c0 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 61  Mode.#endif..  a
2f8d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2f8e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
2f8f0 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70  RVED );.  if( !p
2f900 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2f910 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72  ntDone && pPager
2f920 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
2f930 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
2f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f950 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20  /* Reference to 
2f960 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33  page 1 */.    u3
2f970 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
2f980 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
2f990 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
2f9a0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66  change-counter f
2f9b0 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73  ield */..    ass
2f9c0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
2f9d0 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e  mpFile && isOpen
2f9e0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
2f9f0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  .    /* Open pag
2fa00 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
2fa10 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
2fa20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fa30 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2fa40 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
2fa50 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64 72    assert( pPgHdr
2fa60 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
2fa70 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
2fa80 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20  If page one was 
2fa90 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73 66  fetched successf
2faa0 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66  ully, and this f
2fab0 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  unction is not. 
2fac0 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20     ** operating 
2fad0 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20  in direct-mode, 
2fae0 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69 74  make page 1 writ
2faf0 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74 20  able.  When not 
2fb00 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  in .    ** direc
2fb10 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20 69  t mode, page 1 i
2fb20 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69 6e  s always held in
2fb30 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63 65   cache and hence
2fb40 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29 0a   the PagerGet().
2fb50 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20      ** above is 
2fb60 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66 75  always successfu
2fb70 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41 4c  l - hence the AL
2fb80 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c 49  WAYS on rc==SQLI
2fb90 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20 20  TE_OK..    */.  
2fba0 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d 4f    if( !DIRECT_MO
2fbb0 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63 3d  DE && ALWAYS(rc=
2fbc0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20  =SQLITE_OK) ){. 
2fbd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fbe0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
2fbf0 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  dr);.    }..    
2fc00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fc10 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  K ){.      /* In
2fc20 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
2fc30 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
2fc40 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
2fc50 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
2fc60 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2fc70 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
2fc80 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
2fc90 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
2fca0 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
2fcb0 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33  er++;.      put3
2fcc0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
2fcd0 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c  gHdr->pData)+24,
2fce0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
2fcf0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f  ;..      /* Also
2fd00 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
2fd10 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
2fd20 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
2fd30 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 2a 2a   and in.      **
2fd40 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74   bytes 92..95 st
2fd50 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ore the change c
2fd60 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68  ounter for which
2fd70 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
2fd80 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ber.      ** is 
2fd90 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20  valid. */.      
2fda0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2fdb0 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2fdc0 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +92, change_coun
2fdd0 74 65 72 29 3b 0a 20 20 20 20 20 20 70 75 74 33  ter);.      put3
2fde0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
2fdf0 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c  gHdr->pData)+96,
2fe00 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
2fe10 4e 55 4d 42 45 52 29 3b 0a 0a 20 20 20 20 20 20  NUMBER);..      
2fe20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  /* If running in
2fe30 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72   direct mode, wr
2fe40 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
2fe50 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68   of page 1 to th
2fe60 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
2fe70 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45   if( DIRECT_MODE
2fe80 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
2fe90 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20  t void *zBuf;.  
2fea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2feb0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2fec0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  >0 );.        CO
2fed0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67  DEC2(pPager, pPg
2fee0 48 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36  Hdr->pData, 1, 6
2fef0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
2ff00 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  M, zBuf);.      
2ff10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ff20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2ff30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2ff40 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
2ff50 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
2ff60 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
2ff70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2ff80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ff90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
2ffa0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2ffb0 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
2ffc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2ffd0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2ffe0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2fff0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
30000 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
30010 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
30020 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
30030 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
30040 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20  f(pPgHdr);.  }. 
30050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30060 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
30070 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
30080 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
30090 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  p for in-memory 
300a0 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65  files.** or page
300b0 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  s with the Pager
300c0 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74  .noSync flag set
300d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
300e0 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64  ssful, or called
300f0 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20   on a pager for 
30100 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f  which it is a no
30110 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  -op, this.** fun
30120 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
30130 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
30140 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  se, an IO error 
30150 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
30160 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30170 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
30180 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
30190 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
301a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301b0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
301c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  */.  assert( !ME
301d0 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
301e0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
301f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
30200 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
30210 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
30220 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
30230 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
30240 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
30250 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
30260 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
30270 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
30280 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
30290 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
302a0 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
302b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
302c0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
302d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
302e0 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
302f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
30300 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
30310 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
30320 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
30330 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
30340 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
30350 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
30360 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
30370 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
30380 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
30390 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
303a0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20  ange-counter is 
303b0 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20  updated,.**   * 
303c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
303d0 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68  ynced (unless th
303e0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
303f0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
30400 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c  sed),.**   * all
30410 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65   dirty pages are
30420 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
30430 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a  database file, .
30440 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
30450 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ase file is trun
30460 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72  cated (if requir
30470 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ed), and.**   * 
30480 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30490 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  e synced. .**.**
304a0 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
304b0 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20  that remains to 
304c0 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
304d0 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e  action is to fin
304e0 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74  alize .** (delet
304f0 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  e, truncate or z
30500 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61  ero the first pa
30510 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e  rt of) the journ
30520 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20  al file (or .** 
30530 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
30540 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
30550 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
30560 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
30570 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
30580 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
30590 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
305a0 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
305b0 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
305c0 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
305d0 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
305e0 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
305f0 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
30600 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
30610 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
30620 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
30630 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
30640 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
30650 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
30660 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
30670 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
30680 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
30690 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
306a0 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
306b0 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
306c0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
306d0 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
306e0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
306f0 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
30700 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
30710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30720 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
30730 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
30740 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ster,           
30750 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
30760 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
30770 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nal name */.  in
30780 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20  t noSync        
30790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
307a0 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68   True to omit th
307b0 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64  e xSync on the d
307c0 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  b file */.){.  i
307d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
307e0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
307f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30800 0a 0a 20 20 2f 2a 20 54 68 65 20 64 62 4f 72 69  ..  /* The dbOri
30810 67 53 69 7a 65 20 69 73 20 6e 65 76 65 72 20 73  gSize is never s
30820 65 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  et if journal_mo
30830 64 65 3d 4f 46 46 20 2a 2f 0a 20 20 61 73 73 65  de=OFF */.  asse
30840 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
30850 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
30860 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
30870 7c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  | pPager->dbOrig
30880 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Size==0 );..  /*
30890 20 49 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f   If a prior erro
308a0 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65 70 6f  r occurred, repo
308b0 72 74 20 74 68 61 74 20 65 72 72 6f 72 20 61 67  rt that error ag
308c0 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ain. */.  if( pP
308d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
308e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
308f0 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52  rrCode;..  PAGER
30900 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45  TRACE(("DATABASE
30910 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
30920 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d  Master=%s nSize=
30930 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
30940 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
30950 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
30960 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69  ->dbSize));..  i
30970 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67  f( MEMDB && pPag
30980 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
30990 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
309a0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
309b0 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
309c0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
309d0 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
309e0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68     ** function h
309f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
30a00 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f  called, it is mo
30a10 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48  stly a no-op.  H
30a20 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20  owever, any.    
30a30 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f  ** backup in pro
30a40 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62  gress needs to b
30a50 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20  e restarted..   
30a60 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
30a70 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
30a80 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
30a90 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
30aa0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
30ab0 53 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72  SYNCED && pPager
30ac0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
30ad0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
30ae0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
30af0 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73       PgHdr *pLis
30b00 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
30b10 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
30b20 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
30b30 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
30b40 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
30b50 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
30b60 65 72 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65  er, pList, pPage
30b70 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20  r->dbSize, 1, . 
30b80 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
30b90 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70  er->fullSync ? p
30ba0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
30bb0 73 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29  s : 0).        )
30bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30bd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30be0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
30bf0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
30c00 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
30c10 68 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  he);.      }.   
30c20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
30c30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
30c40 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65  lock updates the
30c50 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
30c60 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a   Exactly how it.
30c70 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68        ** does th
30c80 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
30c90 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
30ca0 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
30cb0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
30cc0 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64    ** was enabled
30cd0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
30ce0 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72  , and if this tr
30cf0 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20  ansaction meets 
30d00 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75  the .      ** ru
30d10 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74  ntime criteria t
30d20 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74  o use the operat
30d30 69 6f 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20  ion: .      **. 
30d40 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65       **    * The
30d50 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
30d60 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
30d70 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
30d80 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  for.      **    
30d90 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
30da0 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20   page-size, and 
30db0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  .      **    * T
30dc0 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
30dd0 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
30de0 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
30df0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  on, and.      **
30e00 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e      * Exactly on
30e10 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
30e20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
30e30 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
30e40 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  l file..      **
30e50 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
30e60 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61   optimization wa
30e70 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74  s not enabled at
30e80 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
30e90 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hen the.      **
30ea0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
30eb0 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63  gecounter() func
30ec0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
30ed0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
30ee0 6e 67 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75  nge.      ** cou
30ef0 6e 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63  nter in 'indirec
30f00 74 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20  t-mode'. If the 
30f10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
30f20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a  compiled in but.
30f30 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
30f40 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68  applicable to th
30f50 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
30f60 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72  call sqlite3Jour
30f70 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20  nalCreate().    
30f80 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72    ** to make sur
30f90 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
30fa0 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  le has actually 
30fb0 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68  been created, th
30fc0 65 6e 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a  en call.      **
30fd0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
30fe0 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
30ff0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
31000 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69  -counter in indi
31010 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f  rect.      ** mo
31020 64 65 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  de. .      **.  
31030 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
31040 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  , if the optimiz
31050 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e  ation is both en
31060 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63  abled and applic
31070 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  able,.      ** t
31080 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69  hen call pager_i
31090 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
310a0 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
310b0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
310c0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69  .      ** in 'di
310d0 72 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74  rect' mode. In t
310e0 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
310f0 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e  rnal file will n
31100 65 76 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a  ever be.      **
31110 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69   created for thi
31120 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
31130 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66       */.  #ifdef
31140 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
31150 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
31160 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
31170 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
31180 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31190 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
311a0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
311b0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
311c0 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73  .      if( !zMas
311d0 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ter && isOpen(pP
311e0 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
311f0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
31200 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
31210 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
31220 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 61 67   .       && pPag
31230 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67  er->dbSize>=pPag
31240 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  er->dbFileSize. 
31250 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50        && (0==(pP
31260 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  g = sqlite3Pcach
31270 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
31280 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20  r->pPCache)) || 
31290 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a  0==pPg->pDirty).
312a0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
312b0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
312c0 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
312d0 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69  unter via the di
312e0 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f  rect-write metho
312f0 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  d. The .        
31300 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  ** following cal
31310 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68  l will modify th
31320 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
31330 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
31340 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
31350 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
31360 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
31370 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
31380 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
31390 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
313a0 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
313b0 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  e file. Because 
313c0 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
313d0 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ite .        ** 
313e0 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
313f0 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
31400 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  , this is safe..
31410 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31420 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
31430 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
31440 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
31450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31460 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
31470 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
31480 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
314a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
314b0 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
314c0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
314d0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
314e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23     }.      }.  #
314f0 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
31500 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
31510 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
31520 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20   0);.  #endif.  
31530 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31540 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
31550 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
31560 69 74 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  it;.  .      /* 
31570 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
31580 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
31590 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
315a0 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
315b0 73 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  s.      ** being
315c0 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
315d0 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
315e0 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
315f0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
31600 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20    ** file. This 
31610 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
31620 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
31630 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ode..      **.  
31640 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65      ** Before re
31650 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 73 20  ading the pages 
31660 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
31670 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
31680 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72  e .      ** curr
31690 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
316a0 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64  er.dbSize, set d
316b0 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68  bSize back to th
316c0 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a  e value.      **
316d0 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74   that it took at
316e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
316f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
31700 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20  therwise, the.  
31710 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
31720 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
31730 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20  ) return zeroed 
31740 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66  pages instead of
31750 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69   .      ** readi
31760 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ng data from the
31770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
31780 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
31790 2a 20 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d  * When journal_m
317a0 6f 64 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f  ode==OFF the dbO
317b0 72 69 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79  rigSize is alway
317c0 73 20 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a  s zero, so this.
317d0 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e        ** block n
317e0 65 76 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75  ever runs if jou
317f0 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20  rnal_mode=OFF.. 
31800 20 20 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65       */.  #ifnde
31810 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31820 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
31830 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
31840 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  e<pPager->dbOrig
31850 53 69 7a 65 20 0a 20 20 20 20 20 20 20 26 26 20  Size .       && 
31860 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a  ALWAYS(pPager->j
31870 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
31880 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
31890 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  F).      ){.    
318a0 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20      Pgno i;     
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
318d0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
318e0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  le */.        co
318f0 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d  nst Pgno iSkip =
31900 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
31910 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69  Pager); /* Pendi
31920 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a  ng lock page */.
31930 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67          const Pg
31940 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  no dbSize = pPag
31950 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20  er->dbSize;     
31960 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d    /* Database im
31970 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20  age size */ .   
31980 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
31990 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
319a0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20  OrigSize;.      
319b0 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b    for( i=dbSize+
319c0 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62  1; i<=pPager->db
319d0 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  OrigSize; i++ ){
319e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
319f0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
31a00 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
31a10 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69  rnal, i) && i!=i
31a20 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
31a30 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
31a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
31a50 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c   Page to journal
31a60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
31a70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31a80 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
31a90 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
31aa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31ab0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
31ac0 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
31ad0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
31ae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31af0 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a  erWrite(pPage);.
31b00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31b10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
31b20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
31b30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31b40 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
31b50 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
31b60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31b80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
31b90 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d   dbSize;.      }
31ba0 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20 20   .  #endif.  .  
31bb0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
31bc0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
31bd0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
31be0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
31bf0 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20 2a   master .      *
31c00 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
31c10 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
31c20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
31c30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31c40 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 69  , .      ** or i
31c50 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c  f zMaster is NUL
31c60 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  L (no master jou
31c70 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73  rnal), then this
31c80 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
31c90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31ca0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
31cb0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
31cc0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
31cd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31ce0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
31cf0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
31d00 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e  .  .      /* Syn
31d10 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
31d20 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69  le. If the atomi
31d30 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
31d40 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20  ation is being. 
31d50 20 20 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68       ** used, th
31d60 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74  is call will not
31d70 20 63 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72   create the jour
31d80 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66  nal file or perf
31d90 6f 72 6d 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  orm any.      **
31da0 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20   real IO..      
31db0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  */.      rc = sy
31dc0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
31dd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
31df0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31e00 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20  ne_exit;.  .    
31e10 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
31e20 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
31e30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31e40 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
31e50 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
31e60 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68  ist(sqlite3Pcach
31e70 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
31e80 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20  r->pPCache));.  
31e90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31ea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31eb0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
31ec0 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
31ed0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  D );.        got
31ee0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
31ef0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  ne_exit;.      }
31f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
31f10 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
31f20 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
31f30 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
31f40 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
31f50 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73  s not the same s
31f60 69 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62  ize as the datab
31f70 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20  ase image,.     
31f80 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67   ** then use pag
31f90 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67  er_truncate to g
31fa0 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68  row or shrink th
31fb0 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  e file here..   
31fc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
31fd0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d  pPager->dbSize!=
31fe0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
31ff0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ze ){.        Pg
32000 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72  no nNew = pPager
32010 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67  ->dbSize - (pPag
32020 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45  er->dbSize==PAGE
32030 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
32040 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
32050 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
32060 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
32070 56 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  VE );.        rc
32080 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
32090 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b  e(pPager, nNew);
320a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
320b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
320c0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
320d0 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  ne_exit;.      }
320e0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e  .  .      /* Fin
320f0 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64  ally, sync the d
32100 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
32110 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
32120 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e  er->noSync && !n
32130 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
32140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
32150 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
32160 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
32170 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gs);.      }.   
32180 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
32190 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
321a0 72 29 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  r)).    }..    p
321b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
321c0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
321d0 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  ..commit_phase_o
321e0 6e 65 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  ne_exit:.  retur
321f0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
32200 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
32210 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
32220 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
32230 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  has been complet
32240 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74  ely.** updated t
32250 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20 63 68  o reflect the ch
32260 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
32270 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
32280 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e  ction and.** syn
32290 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ced to disk. The
322a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
322b0 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68  ill exists in th
322c0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a  e file-system .*
322d0 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66  * though, and if
322e0 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
322f0 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
32300 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  it will eventual
32310 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73  ly.** be used as
32320 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
32330 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
32340 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65  ransaction rolle
32350 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
32360 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61  is function fina
32370 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
32380 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62  l file, either b
32390 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20  y deleting, .** 
323a0 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61  truncating or pa
323b0 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20  rtially zeroing 
323c0 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63  it, so that it c
323d0 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a  annot be used .*
323e0 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61  * for hot-journa
323f0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65  l rollback. Once
32400 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68   this is done th
32410 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
32420 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20  .** irrevocably 
32430 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
32440 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
32450 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
32460 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
32470 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a  d and the pager.
32480 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68  ** moves into th
32490 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f  e error state. O
324a0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
324b0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
324c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
324d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
324e0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
324f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
32500 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
32510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
32520 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
32530 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
32540 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
32550 6c 65 64 20 69 66 20 61 20 70 72 69 6f 72 20 65  led if a prior e
32560 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
32570 64 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28  d..  ** But if (
32580 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
32590 65 72 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20  error elsewhere 
325a0 69 6e 20 74 68 65 20 73 79 73 74 65 6d 29 20 69  in the system) i
325b0 74 20 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20  t does get.  ** 
325c0 63 61 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74  called, just ret
325d0 75 72 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72  urn the same err
325e0 6f 72 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20  or code without 
325f0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
32600 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
32610 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
32620 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
32630 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
32640 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
32650 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
32660 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
32670 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61  is not in at lea
32680 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45  st.  ** PAGER_RE
32690 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 2a 2a  SERVED state. **
326a0 46 49 58 4d 45 2a 2a 3a 20 4d 61 6b 65 20 69 74  FIXME**: Make it
326b0 20 73 6f 20 74 68 61 74 20 74 68 69 73 20 74 65   so that this te
326c0 73 74 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 66  st always.  ** f
326d0 61 69 6c 73 20 2d 20 6d 61 6b 65 20 69 74 20 73  ails - make it s
326e0 6f 20 74 68 61 74 20 77 65 20 6e 65 76 65 72 20  o that we never 
326f0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
32700 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 6f   if we do not ho
32710 6c 64 0a 20 20 2a 2a 20 61 6c 6c 20 6e 65 63 65  ld.  ** all nece
32720 73 73 61 72 79 20 6c 6f 63 6b 73 2e 0a 20 20 2a  ssary locks..  *
32730 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
32740 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
32750 52 56 45 44 20 29 20 72 65 74 75 72 6e 20 53 51  RVED ) return SQ
32760 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f  LITE_ERROR;..  /
32770 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * An optimizatio
32780 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  n. If the databa
32790 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61  se was not actua
327a0 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72  lly modified dur
327b0 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72  ing.  ** this tr
327c0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70  ansaction, the p
327d0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
327e0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
327f0 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73  e and is.  ** us
32800 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a  ing persistent j
32810 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68  ournals, then th
32820 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
32830 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a   no-op..  **.  *
32840 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 74  * The start of t
32850 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
32860 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
32870 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72  ns a single jour
32880 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72  nal .  ** header
32890 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 66   with the nRec f
328a0 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49  ield set to 0. I
328b0 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c  f such a journal
328c0 20 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a   is used as.  **
328d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64   a hot-journal d
328e0 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
328f0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68  l rollback, 0 ch
32900 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61  anges will be ma
32910 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  de.  ** to the d
32920 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f  atabase file. So
32930 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
32940 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f  d to zero the jo
32950 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
32960 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  er. Since the pa
32970 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
32980 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20  ive mode, there 
32990 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20  is no need.  ** 
329a0 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b  to drop any lock
329b0 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  s either..  */. 
329c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
329d0 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50  odified==0 && pP
329e0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
329f0 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61 67 65  ode .   && pPage
32a00 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
32a10 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32a20 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20  E_PERSIST.  ){. 
32a30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32a40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
32a50 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
32a60 61 67 65 72 29 20 7c 7c 20 21 70 50 61 67 65 72  ager) || !pPager
32a70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
32a80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32a90 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  E_OK;.  }..  PAG
32aa0 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54  ERTRACE(("COMMIT
32ab0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
32ac0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73  pPager)));.  ass
32ad0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
32ae0 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
32af0 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50   || MEMDB || !pP
32b00 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
32b10 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
32b20 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
32b30 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
32b40 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72  >setMaster);.  r
32b50 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
32b60 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
32b70 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
32b80 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68   all changes. Th
32b90 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
32ba0 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
32bb0 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  HARED mode..**.*
32bc0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
32bd0 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73  performs two tas
32be0 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  ks:.**.**   1) I
32bf0 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  t rolls back the
32c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72   journal file, r
32c10 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74  estoring all dat
32c20 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a  abase file and .
32c30 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  **      in-memor
32c40 79 20 63 61 63 68 65 20 70 61 67 65 73 20 74 6f  y cache pages to
32c50 20 74 68 65 20 73 74 61 74 65 20 74 68 65 79 20   the state they 
32c60 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65  were in when the
32c70 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
32c80 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c       was opened,
32c90 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20   and.**   2) It 
32ca0 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
32cb0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74  urnal file, so t
32cc0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73  hat it is not us
32cd0 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20  ed for hot.**   
32ce0 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61     rollback at a
32cf0 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ny point in the 
32d00 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75  future..**.** su
32d10 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c  bject to the fol
32d20 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61  lowing qualifica
32d30 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49  tions:.**.** * I
32d40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
32d50 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  le is not yet op
32d60 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
32d70 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
32d80 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20  .**   then only 
32d90 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64  (2) is performed
32da0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
32db0 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e  here is no journ
32dc0 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20  al file.**   to 
32dd0 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  roll back..**.**
32de0 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f   * If in an erro
32df0 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
32e00 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  an SQLITE_FULL, 
32e10 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73  then task (1) is
32e20 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64   .**   performed
32e30 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
32e40 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72   task (2). Regar
32e50 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
32e60 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74  come.**   of eit
32e70 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73  her, the error s
32e80 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
32e90 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
32ea0 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28  he caller.**   (
32eb0 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49  i.e. either SQLI
32ec0 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
32ed0 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
32ee0 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67 65  ** * If the page
32ef0 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45  r is in PAGER_RE
32f00 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
32f10 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20  en attempt (1). 
32f20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20  Whether.**   or 
32f30 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63 63 65  not (1) is succe
32f40 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65  ssful, also atte
32f50 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75 63 63  mpt (2). If succ
32f60 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
32f70 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  *   SQLITE_OK. O
32f80 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20  therwise, enter 
32f90 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
32fa0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 66  and return the f
32fb0 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72  irst .**   error
32fc0 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65   code encountere
32fd0 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74  d. .**.**   In t
32fe0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
32ff0 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
33000 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
33010 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a  s written to. .*
33020 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65 20 74  *   So is safe t
33030 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
33040 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e  ournal file even
33050 20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b   if the playback
33060 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f   .**   (operatio
33070 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77  n 1) failed. How
33080 65 76 65 72 20 74 68 65 20 70 61 67 65 72 20 6d  ever the pager m
33090 75 73 74 20 65 6e 74 65 72 20 74 68 65 20 65 72  ust enter the er
330a0 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61  ror state.**   a
330b0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
330c0 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
330d0 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75  cache are now su
330e0 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46  spect..**.** * F
330f0 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41  inally, if in PA
33100 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74  GER_EXCLUSIVE st
33110 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70  ate, then attemp
33120 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20  t (1). Only.**  
33130 20 61 74 74 65 6d 70 74 20 28 32 29 20 69 66 20   attempt (2) if 
33140 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66 75  (1) is successfu
33150 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  l. Return SQLITE
33160 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
33170 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73  l,.**   otherwis
33180 65 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  e enter the erro
33190 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75  r state and retu
331a0 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
331b0 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20  e from the .**  
331c0 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69   failing operati
331d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74  on..**.**   In t
331e0 68 69 73 20 63 61 73 65 20 74 68 65 20 64 61 74  his case the dat
331f0 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68  abase file may h
33200 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
33210 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a   to. So if the.*
33220 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  *   playback ope
33230 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73  ration did not s
33240 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20  ucceed it would 
33250 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 66  not be safe to f
33260 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65  inalize.**   the
33270 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
33280 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65  t needs to be le
33290 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
332a0 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a  ystem so that.**
332b0 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72     some other pr
332c0 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20 69 74  ocess can use it
332d0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
332e0 64 61 74 61 62 61 73 65 20 73 74 61 74 65 20 28  database state (
332f0 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72  by.**   hot-jour
33300 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a  nal rollback)..*
33310 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33320 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  erRollback(Pager
33330 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
33340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33360 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
33370 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45   */.  PAGERTRACE
33380 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  (("ROLLBACK %d\n
33390 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
333a0 72 29 29 29 3b 0a 20 20 69 66 28 20 70 61 67 65  r)));.  if( page
333b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
333c0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
333d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
333e0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
333f0 70 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e  pPager, SAVEPOIN
33400 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29 3b  T_ROLLBACK, -1);
33410 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
33420 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
33430 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
33440 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20  >setMaster);.   
33450 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33460 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
33470 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
33480 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
33490 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50  .  }else if( !pP
334a0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
334b0 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
334c0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
334d0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
334e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
334f0 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
33500 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ster);.  }else i
33510 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
33520 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
33530 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
33540 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
33550 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
33560 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
33570 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
33580 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
33590 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
335a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
335b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
335c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
335d0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
335e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  ){.      int rc2
335f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
33600 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
33610 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63  er, 0);.      rc
33620 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  2 = pager_end_tr
33630 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
33640 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
33650 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
33660 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33670 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63  .        rc = rc
33680 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  2;.      }.    }
33690 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
336a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
336b0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
336c0 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  }..    if( !MEMD
336d0 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  B ){.      pPage
336e0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
336f0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
33700 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
33710 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
33720 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
33730 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
33740 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
33750 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
33760 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
33770 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
33780 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
33790 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74     ** persistent
337a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
337b0 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
337c0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  ager, rc);.  }. 
337d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
337e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
337f0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
33800 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
33810 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
33820 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
33830 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
33840 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
33850 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74  ble..*/.u8 sqlit
33860 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
33870 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
33880 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
33890 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
338a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
338b0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
338c0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
338d0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
338e0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
338f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
33900 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
33910 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
33920 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
33930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
33940 20 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65   the approximate
33950 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
33960 20 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65   of memory curre
33970 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20  ntly.** used by 
33980 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 74  the pager and it
33990 73 20 61 73 73 6f 63 69 61 74 65 64 20 63 61 63  s associated cac
339a0 68 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  he..*/.int sqlit
339b0 65 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50  e3PagerMemUsed(P
339c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
339d0 20 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65   int perPageSize
339e0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
339f0 69 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  ize + pPager->nE
33a00 78 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74  xtra + 20;.  ret
33a10 75 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a  urn perPageSize*
33a20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
33a30 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
33a40 50 43 61 63 68 65 29 0a 20 20 20 20 20 20 20 20  PCache).        
33a50 20 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c     + sqlite3Mall
33a60 6f 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  ocSize(pPager);.
33a70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
33a80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
33a90 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
33aa0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
33ab0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33ac0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
33ad0 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  DbPage *pPage){.
33ae0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
33af0 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
33b00 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69  nt(pPage);.}..#i
33b10 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
33b20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
33b30 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
33b40 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
33b50 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
33b60 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
33b70 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
33b80 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
33b90 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
33ba0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  = sqlite3PcacheR
33bb0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
33bc0 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d  pPCache);.  a[1]
33bd0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
33be0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
33bf0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
33c00 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  2] = sqlite3Pcac
33c10 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70  heGetCachesize(p
33c20 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
33c30 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
33c40 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20  ->dbSizeValid ? 
33c50 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62  (int) pPager->db
33c60 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34  Size : -1;.  a[4
33c70 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
33c80 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
33c90 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
33ca0 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
33cb0 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
33cc0 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
33cd0 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64  8] = 0;  /* Used
33ce0 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e   to be pPager->n
33cf0 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d  Ovfl */.  a[9] =
33d00 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
33d10 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
33d20 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
33d30 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn a;.}.#endif..
33d40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
33d50 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
33d60 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
33d70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
33d80 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65  agerIsMemdb(Page
33d90 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
33da0 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f  turn MEMDB;.}../
33db0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
33dc0 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61  there are at lea
33dd0 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61  st nSavepoint sa
33de0 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49  vepoints open. I
33df0 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63  f there are.** c
33e00 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68  urrently less th
33e10 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f  an nSavepoints o
33e20 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f  pen, then open o
33e30 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
33e40 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65  oints.** to make
33e50 20 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e   up the differen
33e60 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65  ce. If the numbe
33e70 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20  r of savepoints 
33e80 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71  is already.** eq
33e90 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e  ual to nSavepoin
33ea0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
33eb0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
33ec0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
33ed0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
33ee0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
33ef0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
33f00 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  If an error .** 
33f10 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
33f20 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75  ning the sub-jou
33f30 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
33f40 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
33f50 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
33f60 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
33f70 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
33f80 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
33f90 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
33fa0 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65  Pager, int nSave
33fb0 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
33fc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
33fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fe0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
33ff0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  de */.  int nCur
34000 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  rent = pPager->n
34010 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
34020 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d    /* Current num
34030 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
34040 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76  s */..  if( nSav
34050 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20  epoint>nCurrent 
34060 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
34070 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
34080 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
34090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340a0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
340b0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
340c0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
340d0 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *aNew;          
340e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
340f0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
34100 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
34110 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
34120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34130 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
34140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
34150 2f 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  /..    rc = sqli
34160 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
34170 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
34180 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
34190 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
341a0 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65  /* Grow the Page
341b0 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
341c0 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63  ay using realloc
341d0 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  (). Return SQLIT
341e0 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69  E_NOMEM.    ** i
341f0 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  f the allocation
34200 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73   fails. Otherwis
34210 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20  e, zero the new 
34220 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20  portion in case 
34230 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63  a .    ** malloc
34240 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
34250 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67  while populating
34260 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e   it in the for(.
34270 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a  ..) loop below..
34280 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20      */.    aNew 
34290 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  = (PagerSavepoin
342a0 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  t *)sqlite3Reall
342b0 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67  oc(.        pPag
342c0 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20  er->aSavepoint, 
342d0 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65  sizeof(PagerSave
342e0 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e  point)*nSavepoin
342f0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
34300 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !aNew ){.      
34310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
34320 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
34330 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72  emset(&aNew[nCur
34340 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65  rent], 0, (nSave
34350 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20  point-nCurrent) 
34360 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61  * sizeof(PagerSa
34370 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70  vepoint));.    p
34380 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
34390 74 20 3d 20 61 4e 65 77 3b 0a 0a 20 20 20 20 2f  t = aNew;..    /
343a0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50  * Populate the P
343b0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74  agerSavepoint st
343c0 72 75 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c  ructures just al
343d0 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20  located. */.    
343e0 66 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b  for(ii=nCurrent;
343f0 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20   ii<nSavepoint; 
34400 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 4e 65  ii++){.      aNe
34410 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 6e 50  w[ii].nOrig = nP
34420 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69  age;.      if( i
34430 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
34440 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
34450 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20  urnalOff>0 ){.  
34460 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
34470 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
34480 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
34490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
344a0 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73    aNew[ii].iOffs
344b0 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  et = JOURNAL_HDR
344c0 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
344d0 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b     }.      aNew[
344e0 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50  ii].iSubRec = pP
344f0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20  ager->nSubRec;. 
34500 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49       aNew[ii].pI
34510 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c  nSavepoint = sql
34520 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
34530 28 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  (nPage);.      i
34540 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e  f( !aNew[ii].pIn
34550 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
34560 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
34570 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
34580 7d 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65  }.      if( page
34590 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
345a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
345b0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 28 70  e3WalSavepoint(p
345c0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 61 4e 65  Pager->pWal, aNe
345d0 77 5b 69 69 5d 2e 61 57 61 6c 44 61 74 61 29 3b  w[ii].aWalData);
345e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
345f0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
34600 74 20 3d 20 69 69 2b 31 3b 0a 20 20 20 20 7d 0a  t = ii+1;.    }.
34610 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
34620 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
34630 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
34640 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65    assertTruncate
34650 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
34660 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
34670 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
34680 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34690 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
346a0 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63  ck or release (c
346b0 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69  ommit) a savepoi
346c0 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70  nt..** The savep
346d0 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20  oint to release 
346e0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
346f0 20 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74   not be the most
34700 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72   recently .** cr
34710 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  eated savepoint.
34720 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
34730 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65 69   op is always ei
34740 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  ther SAVEPOINT_R
34750 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50  OLLBACK or SAVEP
34760 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a  OINT_RELEASE..**
34770 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
34780 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
34790 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65  n release and de
347a0 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f  stroy the savepo
347b0 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65  int with.** inde
347c0 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66  x iSavepoint. If
347d0 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
347e0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
347f0 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  rollback all cha
34800 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  nges.** that hav
34810 65 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65  e occurred since
34820 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73   the specified s
34830 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65  avepoint was cre
34840 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ated..**.** The 
34850 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c  savepoint to rol
34860 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65  lback or release
34870 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62   is identified b
34880 79 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20  y parameter .** 
34890 69 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61  iSavepoint. A va
348a0 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74  lue of 0 means t
348b0 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
348c0 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70   outermost savep
348d0 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72  oint.** (the fir
348e0 73 74 20 63 72 65 61 74 65 64 29 2e 20 41 20 76  st created). A v
348f0 61 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e  alue of (Pager.n
34900 53 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61  Savepoint-1) mea
34910 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e  ns operate.** on
34920 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
34930 6c 79 20 63 72 65 61 74 65 64 20 73 61 76 65 70  ly created savep
34940 6f 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f  oint. If iSavepo
34950 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
34960 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53  han.** (Pager.nS
34970 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65  avepoint-1), the
34980 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
34990 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
349a0 2a 20 49 66 20 61 20 6e 65 67 61 74 69 76 65 20  * If a negative 
349b0 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20  value is passed 
349c0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
349d0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65  , then the curre
349e0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
349f0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
34a00 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
34a10 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a  ent to calling .
34a20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
34a30 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73  ollback() becaus
34a40 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
34a50 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61  does not termina
34a60 74 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  te.** the transa
34a70 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20  ction or unlock 
34a80 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
34a90 20 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20 74   just restores t
34aa0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
34ab0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
34ac0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
34ad0 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e  state. .**.** In
34ae0 20 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73   any case, all s
34af0 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61  avepoints with a
34b00 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
34b10 74 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  than iSavepoint 
34b20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65  .** are destroye
34b30 64 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20  d. If this is a 
34b40 72 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f  release operatio
34b50 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  n (op==SAVEPOINT
34b60 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68  _RELEASE),.** th
34b70 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61  en savepoint iSa
34b80 76 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20  vepoint is also 
34b90 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
34ba0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
34bb0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
34bc0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f  _NOMEM if a memo
34bd0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
34be0 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f  ils,.** or an IO
34bf0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
34c00 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
34c10 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20  s while rolling 
34c20 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70  back a .** savep
34c30 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  oint. If no erro
34c40 72 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  rs occur, SQLITE
34c50 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
34c60 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
34c70 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50  PagerSavepoint(P
34c80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
34c90 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
34ca0 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
34cb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
34cc0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
34cd0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
34ce0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
34cf0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73  OLLBACK );.  ass
34d00 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
34d10 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  =0 || op==SAVEPO
34d20 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
34d30 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e  .  if( iSavepoin
34d40 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  t<pPager->nSavep
34d50 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  oint ){.    int 
34d60 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
34d70 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
34d80 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
34d90 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  New;          /*
34da0 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69   Number of remai
34db0 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20  ning savepoints 
34dc0 61 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a  after this op. *
34dd0 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  /..    /* Figure
34de0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61   out how many sa
34df0 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74  vepoints will st
34e00 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66  ill be active af
34e10 74 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ter this.    ** 
34e20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65  operation. Store
34e30 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e   this value in n
34e40 4e 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72  New. Then free r
34e50 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61  esources associa
34e60 74 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68  ted .    ** with
34e70 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20   any savepoints 
34e80 74 68 61 74 20 61 72 65 20 64 65 73 74 72 6f 79  that are destroy
34e90 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
34ea0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
34eb0 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69   nNew = iSavepoi
34ec0 6e 74 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45  nt + (( op==SAVE
34ed0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 20  POINT_RELEASE ) 
34ee0 3f 20 30 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f  ? 0 : 1);.    fo
34ef0 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50  r(ii=nNew; ii<pP
34f00 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
34f10 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ; ii++){.      s
34f20 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
34f30 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
34f40 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
34f50 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
34f60 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76      pPager->nSav
34f70 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a  epoint = nNew;..
34f80 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
34f90 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74  s a release of t
34fa0 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76  he outermost sav
34fb0 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65  epoint, truncate
34fc0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
34fd0 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f  -journal to zero
34fe0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
34ff0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  */.    if( op==S
35000 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
35010 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e   ){.      if( nN
35020 65 77 3d 3d 30 20 26 26 20 69 73 4f 70 65 6e 28  ew==0 && isOpen(
35030 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
35040 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79  .        /* Only
35050 20 74 72 75 6e 63 61 74 65 20 69 66 20 69 74 20   truncate if it 
35060 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
35070 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
35080 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
35090 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
350a0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
350b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
350c0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
350d0 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
350e0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  0);.          as
350f0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
35100 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  _OK );.        }
35110 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
35120 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20  >nSubRec = 0;.  
35130 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
35140 2f 2a 20 45 6c 73 65 20 74 68 69 73 20 69 73 20  /* Else this is 
35150 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  a rollback opera
35160 74 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74  tion, playback t
35170 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76  he specified sav
35180 65 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49  epoint..    ** I
35190 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
351a0 2d 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73  -file, it is pos
351b0 73 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a  sible that the j
351c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a  ournal file has.
351d0 20 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62      ** not yet b
351e0 65 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  een opened. In t
351f0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 68  his case there h
35200 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e  ave been no chan
35210 67 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ges to.    ** th
35220 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
35230 20 73 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b   so the playback
35240 20 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62   operation can b
35250 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a  e skipped..    *
35260 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
35270 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
35280 72 29 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  r) || isOpen(pPa
35290 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
352a0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
352b0 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20  t *pSavepoint = 
352c0 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61  (nNew==0)?0:&pPa
352d0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
352e0 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72  nNew-1];.      r
352f0 63 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63  c = pagerPlaybac
35300 6b 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65  kSavepoint(pPage
35310 72 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r, pSavepoint);.
35320 20 20 20 20 20 20 61 73 73 65 72 74 28 72 63 21        assert(rc!
35330 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20  =SQLITE_DONE);. 
35340 20 20 20 7d 0a 20 20 0a 20 20 7d 0a 20 20 72 65     }.  .  }.  re
35350 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35360 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
35370 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
35380 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
35390 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
353a0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
353b0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
353c0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
353d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
353e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
353f0 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75   the VFS structu
35400 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  re for the pager
35410 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
35420 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50  e3_vfs *sqlite3P
35430 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70  agerVfs(Pager *p
35440 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
35450 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d   pPager->pVfs;.}
35460 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
35470 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
35480 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
35490 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a  file associated.
354a0 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
354b0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72  r.  This might r
354c0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
354d0 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f  e file has.** no
354e0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
354f0 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69  d..*/.sqlite3_fi
35500 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  le *sqlite3Pager
35510 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  File(Pager *pPag
35520 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
35530 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a  ager->fd;.}../*.
35540 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
35550 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
35560 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
35570 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
35580 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
35590 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
355a0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
355b0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
355c0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
355d0 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63  rn true if fsync
355e0 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73  () calls are dis
355f0 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70  abled for this p
35600 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ager.  Return FA
35610 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28  LSE.** if fsync(
35620 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20  )s are executed 
35630 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  normally..*/.int
35640 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
35650 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
35660 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
35670 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
35680 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
35690 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65  S_CODEC./*.** Se
356a0 74 20 6f 72 20 72 65 74 72 69 65 76 65 20 74 68  t or retrieve th
356b0 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
356c0 20 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63   pager.*/.static
356d0 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67   void sqlite3Pag
356e0 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61  erSetCodec(.  Pa
356f0 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
35700 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
35710 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
35720 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  int),.  void (*x
35730 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76  CodecSizeChng)(v
35740 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20  oid*,int,int),. 
35750 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
35760 65 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  ee)(void*),.  vo
35770 69 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20  id *pCodec.){.  
35780 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
35790 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
357a0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
357b0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70  er->pCodec);.  p
357c0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20  Pager->xCodec = 
357d0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20  pPager->memDb ? 
357e0 30 20 3a 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  0 : xCodec;.  pP
357f0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
35800 43 68 6e 67 20 3d 20 78 43 6f 64 65 63 53 69 7a  Chng = xCodecSiz
35810 65 43 68 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d  eChng;.  pPager-
35820 3e 78 43 6f 64 65 63 46 72 65 65 20 3d 20 78 43  >xCodecFree = xC
35830 6f 64 65 63 46 72 65 65 3b 0a 20 20 70 50 61 67  odecFree;.  pPag
35840 65 72 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f  er->pCodec = pCo
35850 64 65 63 3b 0a 20 20 70 61 67 65 72 52 65 70 6f  dec;.  pagerRepo
35860 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
35870 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73  }.static void *s
35880 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 43 6f  qlite3PagerGetCo
35890 64 65 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  dec(Pager *pPage
358a0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
358b0 67 65 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23  ger->pCodec;.}.#
358c0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
358d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
358e0 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
358f0 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f   the page pPg to
35900 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
35910 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
35920 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
35930 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
35940 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
35950 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a  usly located at.
35960 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77  ** pgno (which w
35970 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74  e call pPgOld) t
35980 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20  hough that page 
35990 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
359a0 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49  .** in cache.  I
359b0 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  f the page previ
359c0 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
359d0 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
359e0 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72  eady.** in the r
359f0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
35a00 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74   it is not put t
35a10 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20  here by by this 
35a20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
35a30 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
35a40 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e   page pPg remain
35a50 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
35a60 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
35a70 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
35a80 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61  h pPg (i.e. data
35a90 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
35aa0 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
35ab0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
35ac0 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
35ad0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
35ae0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
35af0 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
35b00 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
35b10 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
35b20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
35b30 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
35b40 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
35b50 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
35b60 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
35b70 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
35b80 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
35b90 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
35ba0 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
35bb0 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
35bc0 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
35bd0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
35be0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
35bf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
35c00 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20  ourth argument, 
35c10 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e  isCommit, is non
35c20 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73  -zero, then this
35c30 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a   page is being.*
35c40 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20  * moved as part 
35c50 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65  of a database re
35c60 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73  organization jus
35c70 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  t before the tra
35c80 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nsaction .** is 
35c90 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e  being committed.
35ca0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
35cb0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
35cc0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
35cd0 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72  e page .** pPg r
35ce0 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f  efers to will no
35cf0 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
35d00 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
35d10 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  s transaction..*
35d20 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
35d30 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
35d40 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
35d50 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
35d60 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
35d70 63 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  curs. Otherwise,
35d80 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
35d90 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
35da0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
35db0 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
35dc0 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50  , DbPage *pPg, P
35dd0 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73  gno pgno, int is
35de0 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72  Commit){.  PgHdr
35df0 20 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20   *pPgOld;       
35e00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
35e10 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  age being overwr
35e20 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f  itten. */.  Pgno
35e30 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
35e40 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20  0;       /* Old 
35e50 76 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67  value of pPg->pg
35e60 6e 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72  no, if sync is r
35e70 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74  equired */.  int
35e80 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
35e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
35ea0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67  urn code */.  Pg
35eb0 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20  no origPgno;    
35ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
35ed0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
35ee0 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73  number */..  ass
35ef0 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
35f00 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72 64   );..  /* In ord
35f10 65 72 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  er to be able to
35f20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 6e 20 69 6e   rollback, an in
35f30 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
35f40 20 6d 75 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20   must journal.  
35f50 2a 2a 20 74 68 65 20 70 61 67 65 20 77 65 20 61  ** the page we a
35f60 72 65 20 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a  re moving from..
35f70 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
35f80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
35f90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35fa0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
35fb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
35fc0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
35fd0 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69  ge being moved i
35fe0 73 20 64 69 72 74 79 20 61 6e 64 20 68 61 73 20  s dirty and has 
35ff0 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20 62  not been saved b
36000 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a  y the latest.  *
36010 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65  * savepoint, the
36020 6e 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65  n save the curre
36030 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
36040 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
36050 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e   .  ** sub-journ
36060 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  al now. This is 
36070 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64  required to hand
36080 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  le the following
36090 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a   scenario:.  **.
360a0 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
360b0 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
360c0 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64  page X, then mod
360d0 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79  ify it in memory
360e0 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50  >.  **     SAVEP
360f0 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20  OINT one;.  **  
36100 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20       <Move page 
36110 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e  X to location Y>
36120 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41  .  **     ROLLBA
36130 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a  CK TO one;.  **.
36140 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77    ** If page X w
36150 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  ere not written 
36160 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
36170 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c  al here, it woul
36180 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f  d not.  ** be po
36190 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72  ssible to restor
361a0 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77  e its contents w
361b0 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
361c0 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73  K TO one".  ** s
361d0 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73  tatement were is
361e0 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a   processed..  **
361f0 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c  .  ** subjournal
36200 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20  Page() may need 
36210 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  to allocate spac
36220 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e  e to store pPg->
36230 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f  pgno into.  ** o
36240 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
36250 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68  oint bitvecs. Th
36260 69 73 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e  is is the reason
36270 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
36280 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
36290 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a  QLITE_NOMEM..  *
362a0 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61  /.  if( pPg->fla
362b0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 0a 20  gs&PGHDR_DIRTY. 
362c0 20 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65    && subjRequire
362d0 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 26 26  sPage(pPg).   &&
362e0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
362f0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
36300 28 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20  (pPg)).  ){.    
36310 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
36320 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4d    PAGERTRACE(("M
36330 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
36340 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
36350 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
36360 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
36370 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
36380 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
36390 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
363a0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52  , pgno));.  IOTR
363b0 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64  ACE(("MOVE %p %d
363c0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
363d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29  pPg->pgno, pgno)
363e0 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  )..  /* If the j
363f0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
36400 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
36410 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e  re page pPg->pgn
36420 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72  o can.  ** be wr
36430 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20  itten to, store 
36440 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63  pPg->pgno in loc
36450 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64  al variable need
36460 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20  SyncPgno..  **. 
36470 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d   ** If the isCom
36480 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  mit flag is set,
36490 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
364a0 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
364b0 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  at.  ** the jour
364c0 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
364d0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
364e0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50  database page pP
364f0 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61  g->pgno .  ** ca
36500 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
36510 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
36520 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
36530 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
36540 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
36550 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
36560 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20  R_NEED_SYNC) && 
36570 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  !isCommit ){.   
36580 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
36590 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  pPg->pgno;.    a
365a0 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75  ssert( pageInJou
365b0 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67  rnal(pPg) || pPg
365c0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
365d0 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20  bOrigSize );.   
365e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
365f0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
36600 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
36610 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
36620 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
36630 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
36640 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
36650 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
36660 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
36670 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68  from its hash ch
36680 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
36690 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
366a0 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
366b0 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
366c0 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
366d0 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
366e0 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
366f0 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
36700 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
36710 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c  ..  */.  pPg->fl
36720 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
36730 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c  ED_SYNC;.  pPgOl
36740 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  d = pager_lookup
36750 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
36760 20 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c    assert( !pPgOl
36770 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65  d || pPgOld->nRe
36780 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50  f==1 );.  if( pP
36790 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d  gOld ){.    pPg-
367a0 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c  >flags |= (pPgOl
367b0 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  d->flags&PGHDR_N
367c0 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20 69  EED_SYNC);.    i
367d0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
367e0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 69 73 63    /* Do not disc
367f0 61 72 64 20 70 61 67 65 73 20 66 72 6f 6d 20 61  ard pages from a
36800 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
36810 62 61 73 65 20 73 69 6e 63 65 20 77 65 20 6d 69  base since we mi
36820 67 68 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65  ght.      ** nee
36830 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 61  d to rollback la
36840 74 65 72 2e 20 20 4a 75 73 74 20 6d 6f 76 65 20  ter.  Just move 
36850 74 68 65 20 70 61 67 65 20 6f 75 74 20 6f 66 20  the page out of 
36860 74 68 65 20 77 61 79 2e 20 2a 2f 0a 20 20 20 20  the way. */.    
36870 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36880 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
36890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
368a0 61 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c  acheMove(pPgOld,
368b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b   pPager->dbSize+
368c0 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
368d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
368e0 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a  heDrop(pPgOld);.
368f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69      }.  }..  ori
36900 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  gPgno = pPg->pgn
36910 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  o;.  sqlite3Pcac
36920 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f  heMove(pPg, pgno
36930 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
36940 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
36950 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  ;.  pPager->dbMo
36960 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69  dified = 1;..  i
36970 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  f( needSyncPgno 
36980 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65  ){.    /* If nee
36990 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e  dSyncPgno is non
369a0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
369b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
369c0 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  ds to be .    **
369d0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
369e0 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69   any data is wri
369f0 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65  tten to database
36a00 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53   file page needS
36a10 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20  yncPgno..    ** 
36a20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75  Currently, no su
36a30 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69  ch page exists i
36a40 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
36a50 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
36a60 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20   "is journaled" 
36a70 62 69 74 76 65 63 20 66 6c 61 67 20 68 61 73 20  bitvec flag has 
36a80 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
36a90 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
36aa0 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f  ied by.    ** lo
36ab0 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 20 69  ading the page i
36ac0 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
36ad0 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
36ae0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
36af0 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e  nc .    ** flag.
36b00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
36b10 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
36b20 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69   load the page i
36b30 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63  nto the page-cac
36b40 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20  he fails, (due. 
36b50 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f     ** to a mallo
36b60 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72  c() or IO failur
36b70 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69  e), clear the bi
36b80 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72  t in the pInJour
36b90 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72  nal[].    ** arr
36ba0 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ay. Otherwise, i
36bb0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f  f the page is lo
36bc0 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e  aded and written
36bd0 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a   again in.    **
36be0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
36bf0 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69  n, it may be wri
36c00 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
36c10 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
36c20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79  .    ** it is sy
36c30 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f  nced into the jo
36c40 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
36c50 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64   way, it may end
36c60 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68   up in.    ** th
36c70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
36c80 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69  wice, but that i
36c90 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e  s not a problem.
36ca0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
36cb0 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
36cc0 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61  et() call may ca
36cd0 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  use the journal 
36ce0 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65  to sync. So make
36cf0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65  .    ** sure the
36d00 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
36d10 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e  flag is set too.
36d20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64  .    */.    PgHd
36d30 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61  r *pPgHdr;.    a
36d40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
36d50 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72  eedSync );.    r
36d60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36d70 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  Get(pPager, need
36d80 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64  SyncPgno, &pPgHd
36d90 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
36da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36db0 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50     if( needSyncP
36dc0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
36dd0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
36de0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36df0 72 2d 3e 70 54 6d 70 53 70 61 63 65 21 3d 30 20  r->pTmpSpace!=0 
36e00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
36e10 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50  e3BitvecClear(pP
36e20 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
36e30 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
36e40 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
36e50 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
36e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36e70 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
36e80 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
36e90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36ea0 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d  >noSync==0 && !M
36eb0 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48  EMDB );.    pPgH
36ec0 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  dr->flags |= PGH
36ed0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
36ee0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
36ef0 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29  akeDirty(pPgHdr)
36f00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
36f10 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
36f20 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
36f30 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
36f40 20 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65 20   database, make 
36f50 73 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61  sure the origina
36f60 6c 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65 73  l page continues
36f70 0a 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20  .  ** to exist, 
36f80 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e  in case the tran
36f90 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
36fa0 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 55 73 65   roll back.  Use
36fb0 20 70 50 67 4f 6c 64 0a 20 20 2a 2a 20 61 73 20   pPgOld.  ** as 
36fc0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
36fd0 65 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 61  e since it has a
36fe0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
36ff0 63 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  cated..  */.  if
37000 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73  ( MEMDB ){.    s
37010 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65  qlite3PcacheMove
37020 28 70 50 67 4f 6c 64 2c 20 6f 72 69 67 50 67 6e  (pPgOld, origPgn
37030 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  o);.    sqlite3P
37040 61 67 65 72 55 6e 72 65 66 28 70 50 67 4f 6c 64  agerUnref(pPgOld
37050 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
37060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
37070 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
37080 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
37090 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
370a0 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
370b0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
370c0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
370d0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73  Page *pPg){.  as
370e0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
370f0 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  0 || pPg->pPager
37100 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74  ->memDb );.  ret
37110 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  urn pPg->pData;.
37120 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
37130 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
37140 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
37150 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73  tes of "extra" s
37160 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  pace .** allocat
37170 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
37180 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
37190 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
371a0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
371b0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
371c0 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 45 78 74  return pPg->pExt
371d0 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  ra;.}../*.** Get
371e0 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
371f0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
37200 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
37210 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
37220 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
37230 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
37240 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
37250 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
37260 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
37270 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
37280 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
37290 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
372a0 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
372b0 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
372c0 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
372d0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
372e0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
372f0 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
37300 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
37310 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
37320 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
37330 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
37340 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
37350 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
37360 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
37370 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37380 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
37390 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
373a0 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
373b0 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
373c0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
373d0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
373e0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
373f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
37400 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
37410 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
37420 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
37430 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
37440 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
37450 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
37460 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
37470 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
37480 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43  >=0 && PAGER_LOC
37490 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
374a0 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  VE>=0 );.  if( e
374b0 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67  Mode>=0 && !pPag
374c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
374d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
374e0 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
374f0 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
37500 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
37510 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
37520 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
37530 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f   journal-mode fo
37540 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
37550 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
37560 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  st be one of:.**
37570 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
37580 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
37590 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
375a0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
375b0 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
375c0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
375d0 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
375e0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20  RNALMODE_OFF.** 
375f0 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
37600 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20 20  MODE_MEMORY.**  
37610 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
37620 4f 44 45 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 54 68  ODE_WAL.**.** Th
37630 65 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 69 73  e journalmode is
37640 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
37650 65 20 73 70 65 63 69 66 69 65 64 20 69 66 20 74  e specified if t
37660 68 65 20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c  he change is all
37670 6f 77 65 64 2e 0a 2a 2a 20 54 68 65 20 63 68 61  owed..** The cha
37680 6e 67 65 20 6d 61 79 20 62 65 20 64 69 73 61 6c  nge may be disal
37690 6c 6f 77 65 64 20 66 6f 72 20 74 68 65 20 66 6f  lowed for the fo
376a0 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a  llowing reasons:
376b0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69  .**.**   *  An i
376c0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
376d0 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20  e can only have 
376e0 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  its journal_mode
376f0 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20   set to _OFF.** 
37700 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e       or _MEMORY.
37710 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 65 6d 70  .**.**   *  Temp
37720 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 20  orary databases 
37730 63 61 6e 6e 6f 74 20 68 61 76 65 20 5f 57 41 4c  cannot have _WAL
37740 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 2e 0a 2a 2a   journalmode..**
37750 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
37760 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75   indicate the cu
37770 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
37780 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c  updated) journal
37790 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
377a0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4a 6f 75  lite3PagerSetJou
377b0 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a  rnalMode(Pager *
377c0 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
377d0 65 29 7b 0a 20 20 75 38 20 65 4f 6c 64 20 3d 20  e){.  u8 eOld = 
377e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
377f0 6f 64 65 3b 20 20 20 20 2f 2a 20 50 72 69 6f 72  ode;    /* Prior
37800 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 2a 2f 0a   journalmode */.
37810 0a 20 20 2f 2a 20 54 68 65 20 65 4d 6f 64 65 20  .  /* The eMode 
37820 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6c 77  parameter is alw
37830 61 79 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 61  ays valid */.  a
37840 73 73 65 72 74 28 20 20 20 20 20 20 65 4d 6f 64  ssert(      eMod
37850 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
37860 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
37870 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
37880 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
37890 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20  ODE_TRUNCATE.   
378a0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
378b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
378c0 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
378d0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
378e0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
378f0 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
37900 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
37910 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37920 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20  E_WAL .         
37930 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
37940 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
37950 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 2f 2a 20 44  EMORY );..  /* D
37960 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  o not allow the 
37970 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 6f 66 20 61  journalmode of a
37980 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 74   TEMP database t
37990 6f 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  o be changed to 
379a0 57 41 4c 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  WAL.  */.  if( p
379b0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
379c0 26 26 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  && eMode==PAGER_
379d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
379e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
379f0 4f 6c 64 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  Old!=PAGER_JOURN
37a00 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 3b 0a 20 20  ALMODE_WAL );.  
37a10 20 20 65 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a    eMode = eOld;.
37a20 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 61 6c 6c    }..  /* Do all
37a30 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6d 6f  ow the journalmo
37a40 64 65 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f  de of an in-memo
37a50 72 79 20 64 61 74 61 62 61 73 65 20 74 6f 20 62  ry database to b
37a60 65 20 73 65 74 20 74 6f 0a 20 20 2a 2a 20 61 6e  e set to.  ** an
37a70 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ything other tha
37a80 6e 20 4d 45 4d 4f 52 59 20 6f 72 20 4f 46 46 0a  n MEMORY or OFF.
37a90 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42    */.  if( MEMDB
37aa0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37ab0 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  eOld==PAGER_JOUR
37ac0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
37ad0 7c 20 65 4f 6c 64 3d 3d 50 41 47 45 52 5f 4a 4f  | eOld==PAGER_JO
37ae0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
37af0 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 21 3d  .    if( eMode!=
37b00 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37b10 45 5f 4d 45 4d 4f 52 59 20 26 26 20 65 4d 6f 64  E_MEMORY && eMod
37b20 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
37b30 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
37b40 20 20 65 4d 6f 64 65 20 3d 20 65 4f 6c 64 3b 0a    eMode = eOld;.
37b50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
37b60 20 65 4d 6f 64 65 21 3d 65 4f 6c 64 20 29 7b 0a   eMode!=eOld ){.
37b70 20 20 20 20 2f 2a 20 57 68 65 6e 20 63 68 61 6e      /* When chan
37b80 67 69 6e 67 20 62 65 74 77 65 65 6e 20 72 6f 6c  ging between rol
37b90 6c 62 61 63 6b 20 6d 6f 64 65 73 2c 20 63 6c 6f  lback modes, clo
37ba0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
37bb0 69 6c 65 20 70 72 69 6f 72 0a 20 20 20 20 2a 2a  ile prior.    **
37bc0 20 74 6f 20 74 68 65 20 63 68 61 6e 67 65 2e 20   to the change. 
37bd0 20 42 75 74 20 77 68 65 6e 20 63 68 61 6e 67 69   But when changi
37be0 6e 67 20 66 72 6f 6d 20 61 20 72 6f 6c 6c 62 61  ng from a rollba
37bf0 63 6b 20 6d 6f 64 65 20 74 6f 20 57 41 4c 2c 20  ck mode to WAL, 
37c00 6b 65 65 70 0a 20 20 20 20 2a 2a 20 74 68 65 20  keep.    ** the 
37c10 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 73 69 6e  journal open sin
37c20 63 65 20 74 68 65 72 65 20 69 73 20 61 20 72 6f  ce there is a ro
37c30 6c 6c 62 61 63 6b 2d 73 74 79 6c 65 20 74 72 61  llback-style tra
37c40 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 6c 61 79  nsaction in play
37c50 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 74 6f 20  .    ** used to 
37c60 63 6f 6e 76 65 72 74 20 74 68 65 20 76 65 72 73  convert the vers
37c70 69 6f 6e 20 6e 75 6d 62 65 72 73 20 69 6e 20 74  ion numbers in t
37c80 68 65 20 62 74 72 65 65 20 68 65 61 64 65 72 2e  he btree header.
37c90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
37ca0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
37cb0 66 64 29 20 26 26 20 65 4d 6f 64 65 21 3d 50 41  fd) && eMode!=PA
37cc0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37cd0 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  WAL ){.      sql
37ce0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
37cf0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
37d00 0a 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  .    /* Change t
37d10 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  he journal mode.
37d20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
37d30 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75  journalMode = (u
37d40 38 29 65 4d 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a  8)eMode;..    /*
37d50 20 57 68 65 6e 20 74 72 61 6e 73 69 73 74 69 6f   When transistio
37d60 6e 69 6e 67 20 66 72 6f 6d 20 54 52 55 4e 43 41  ning from TRUNCA
37d70 54 45 20 6f 72 20 50 45 52 53 49 53 54 20 74 6f  TE or PERSIST to
37d80 20 61 6e 79 20 6f 74 68 65 72 20 6a 6f 75 72 6e   any other journ
37d90 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 65  al.    ** mode e
37da0 78 63 65 70 74 20 57 41 4c 20 28 61 6e 64 20 77  xcept WAL (and w
37db0 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 6c 6f 63  e are not in loc
37dc0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
37dd0 49 56 45 29 20 74 68 65 6e 20 0a 20 20 20 20 2a  IVE) then .    *
37de0 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  * delete the jou
37df0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
37e00 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
37e10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37e20 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
37e30 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
37e40 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
37e50 4f 44 45 5f 50 45 52 53 49 53 54 20 26 20 35 29  ODE_PERSIST & 5)
37e60 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
37e70 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
37e80 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 26 20 35  LMODE_DELETE & 5
37e90 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
37ea0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
37eb0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 26 20  ALMODE_MEMORY & 
37ec0 35 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  5)==4 );.    ass
37ed0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
37ee0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 26 20 35 29  NALMODE_OFF & 5)
37ef0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
37f00 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
37f10 4c 4d 4f 44 45 5f 57 41 4c 20 26 20 35 29 3d 3d  LMODE_WAL & 5)==
37f20 35 20 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  5 );..    assert
37f30 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
37f40 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
37f50 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b  exclusiveMode );
37f60 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
37f70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
37f80 26 26 20 28 65 4f 6c 64 20 26 20 35 29 3d 3d 31  && (eOld & 5)==1
37f90 20 26 26 20 28 65 4d 6f 64 65 20 26 20 31 29 3d   && (eMode & 1)=
37fa0 3d 30 20 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 ){..      /* 
37fb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
37fc0 77 6f 75 6c 64 20 6c 69 6b 65 20 74 6f 20 64 65  would like to de
37fd0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
37fe0 20 66 69 6c 65 2e 20 49 66 20 69 74 20 69 73 0a   file. If it is.
37ff0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 70 6f 73        ** not pos
38000 73 69 62 6c 65 2c 20 74 68 65 6e 20 74 68 61 74  sible, then that
38010 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
38020 6d 2e 20 44 65 6c 65 74 69 6e 67 20 74 68 65 20  m. Deleting the 
38030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
38040 20 20 20 2a 2a 20 68 65 72 65 20 69 73 20 61 6e     ** here is an
38050 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
38060 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ly..      **.   
38070 20 20 20 2a 2a 20 42 65 66 6f 72 65 20 64 65 6c     ** Before del
38080 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
38090 6c 20 66 69 6c 65 2c 20 6f 62 74 61 69 6e 20 61  l file, obtain a
380a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
380b0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
380c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
380d0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
380e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
380f0 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
38100 20 20 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 69        ** while i
38110 74 20 69 73 20 69 6e 20 75 73 65 20 62 79 20 73  t is in use by s
38120 6f 6d 65 20 6f 74 68 65 72 20 63 6c 69 65 6e 74  ome other client
38130 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
38140 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
38150 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  _OK;.      int s
38160 74 61 74 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  tate = pPager->s
38170 74 61 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  tate;.      if( 
38180 73 74 61 74 65 3c 50 41 47 45 52 5f 53 48 41 52  state<PAGER_SHAR
38190 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ED ){.        rc
381a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
381b0 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  haredLock(pPager
381c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
381d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
381e0 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
381f0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
38200 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
38210 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  K );.        rc 
38220 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
38230 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
38240 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
38250 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
38260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
38270 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
38280 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
38290 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
382a0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
382b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
382c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 74  =SQLITE_OK && st
382d0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
382e0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D ){.        sql
382f0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
38300 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
38310 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  LOCK);.      }el
38320 73 65 20 69 66 28 20 73 74 61 74 65 3d 3d 50 41  se if( state==PA
38330 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
38340 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
38350 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
38360 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
38370 28 20 73 74 61 74 65 3d 3d 70 50 61 67 65 72 2d  ( state==pPager-
38380 3e 73 74 61 74 65 20 29 3b 0a 20 20 20 20 7d 0a  >state );.    }.
38390 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e    }..  /* Return
383a0 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
383b0 20 6d 6f 64 65 20 2a 2f 0a 20 20 72 65 74 75 72   mode */.  retur
383c0 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a  n (int)pPager->j
383d0 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f  ournalMode;.}../
383e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
383f0 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  current journal 
38400 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
38410 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72  ite3PagerGetJour
38420 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  nalMode(Pager *p
38430 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
38440 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
38450 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urnalMode;.}../*
38460 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
38470 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
38480 69 6e 20 61 20 73 74 61 74 65 20 77 68 65 72 65  in a state where
38490 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 63 68 61   it is OK to cha
384a0 6e 67 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  nge the.** journ
384b0 61 6c 6d 6f 64 65 2e 20 20 4a 6f 75 72 6e 61 6c  almode.  Journal
384c0 6d 6f 64 65 20 63 68 61 6e 67 65 73 20 63 61 6e  mode changes can
384d0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 68 65   only happen whe
384e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
384f0 2a 20 69 73 20 75 6e 6d 6f 64 69 66 69 65 64 2e  * is unmodified.
38500 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
38510 61 67 65 72 4f 6b 54 6f 43 68 61 6e 67 65 4a 6f  agerOkToChangeJo
38520 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20  urnalMode(Pager 
38530 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
38540 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
38550 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
38560 20 69 66 28 20 4e 45 56 45 52 28 69 73 4f 70 65   if( NEVER(isOpe
38570 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
38580 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
38590 6c 4f 66 66 3e 30 29 20 29 20 72 65 74 75 72 6e  lOff>0) ) return
385a0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
385b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
385c0 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20   the size-limit 
385d0 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74  used for persist
385e0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
385f0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67  s..**.** Setting
38600 20 74 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20   the size limit 
38610 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c  to -1 means no l
38620 69 6d 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64  imit is enforced
38630 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20  ..** An attempt 
38640 74 6f 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73  to set a limit s
38650 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69  maller than -1 i
38660 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36  s a no-op..*/.i6
38670 34 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  4 sqlite3PagerJo
38680 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50  urnalSizeLimit(P
38690 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36  ager *pPager, i6
386a0 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28  4 iLimit){.  if(
386b0 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20   iLimit>=-1 ){. 
386c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
386d0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c  alSizeLimit = iL
386e0 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
386f0 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  rn pPager->journ
38700 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a  alSizeLimit;.}..
38710 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
38720 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50  oint