/ Hex Artifact Content
Login

Artifact 24a9be67a52fb5837be4d0319904a273164dee3a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b 57    u32 aWalData[W
2660: 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41  AL_SAVEPOINT_NDA
2670: 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  TA];        /* W
2680: 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f 6e  AL savepoint con
2690: 74 65 78 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  text */.};../*.*
26a0: 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61  * A open page ca
26b0: 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  che is an instan
26c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26d0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
26e0: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
26f0: 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f  **   Pager.errCo
2700: 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  de may be set to
2710: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
2720: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
2730: 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45  r.**   or SQLITE
2740: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
2750: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
2760: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
2770: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
2780: 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e     and is return
2790: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
27a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
27b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
27c0: 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45   The.**   SQLITE
27d0: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
27e0: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
27f0: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
2800: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
2810: 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75  the.**   next su
2820: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
2830: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
2840: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
2850: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51  e. Also,.**   SQ
2860: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
2870: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
2880: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2890: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
28a0: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50  Lookup().**   AP
28b0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
28c0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
28d0: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64  ssfully..**.** d
28e0: 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69  bSizeValid, dbSi
28f0: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
2900: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
2910: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
2920: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2930: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
2940: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
2950: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
2960: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
2970: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
2980: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
2990: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
29a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
29b0: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
29c0: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
29d0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
29e0: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
29f0: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
2a00: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
2a20: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
2a30: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
2a40: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
2a50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a60: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
2a70: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
2a80: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
2a90: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
2aa0: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
2ab0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
2ac0: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
2ad0: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
2ae0: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
2af0: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
2b00: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
2b10: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
2b20: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
2b30: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
2b40: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2b50: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
2b60: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
2b70: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
2b80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2b90: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ba0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2bb0: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
2bc0: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
2bd0: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
2be0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2bf0: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
2c00: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
2c10: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
2c20: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
2c30: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
2c40: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
2c50: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
2c60: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
2c70: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
2c80: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
2c90: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
2ca0: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
2cb0: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
2cc0: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
2cd0: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
2ce0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
2cf0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2d00: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
2d10: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
2d20: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
2d30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d40: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
2d50: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
2d60: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
2d70: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
2d80: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
2d90: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
2da0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2db0: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
2dc0: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
2dd0: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
2de0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2e00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2e10: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
2e20: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
2e30: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
2e40: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
2e50: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
2e60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e70: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
2e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2e90: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
2ea0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
2eb0: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
2ec0: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
2ed0: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
2ee0: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
2ef0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2f00: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
2f10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2f20: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2f30: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
2f40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
2f50: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2f60: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
2f70: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
2f80: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
2f90: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2fa0: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
2fb0: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
2fc0: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
2fd0: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
2fe0: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
2ff0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
3000: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3010: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3020: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
3030: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
3040: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
3050: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
3060: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
3070: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
3080: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
3090: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
30a0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
30b0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
30c0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
30d0: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
30e0: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
30f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
3100: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
3110: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3120: 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  the the main jou
3130: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61  rnal is opened a
3140: 6e 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69  nd.**   initiali
3150: 7a 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  zed.**.**   The 
3160: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c  point of this fl
3170: 61 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75  ag is that it mu
3180: 73 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20  st be set after 
3190: 74 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20  the .**   first 
31a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
31b0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
31c0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
31d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41   to disk..**   A
31e0: 66 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61  fter this has ha
31f0: 70 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65  ppened, new page
3200: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
3210: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  e database .**  
3220: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65   do not need the
3230: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
3240: 20 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68   flag set, as th
3250: 65 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a  ey do not need.*
3260: 2a 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20  *   to wait for 
3270: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62  a journal sync b
3280: 65 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62  efore they can b
3290: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
32a0: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
32b0: 73 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e  se file (see fun
32c0: 63 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74  ction pager_writ
32d0: 65 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73  e())..**   .** s
32e0: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
32f0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
3300: 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
3310: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72   that the master
3320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
3330: 6d 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29  me.**   (if any)
3340: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
3350: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
3360: 6c 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a  l file once..**.
3370: 2a 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74  **   When commit
3380: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
3390: 6f 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  on, the master j
33a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
33b0: 20 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d   (if any).**   m
33c0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ay be written in
33d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
33e0: 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61  ile while the pa
33f0: 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a  ger is still in.
3400: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
3410: 56 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43  VED state (see C
3420: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
3430: 66 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e  for the action).
3440: 20 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74   It.**   then at
3450: 74 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64  tempts to upgrad
3460: 65 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  e to an exclusiv
3470: 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20  e lock. If this 
3480: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69  attempt.**   fai
3490: 6c 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ls, then SQLITE_
34a0: 42 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75  BUSY may be retu
34b0: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
34c0: 20 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a   and the user.**
34d0: 20 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74     may attempt t
34e0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
34f0: 6e 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c  nsaction again l
3500: 61 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a  ater (calling.**
3510: 20 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e     CommitPhaseOn
3520: 65 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73  e() again). This
3530: 20 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f   flag is used to
3540: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
3550: 20 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f   .**   master jo
3560: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e  urnal name is on
3570: 6c 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ly written to th
3580: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
3590: 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69  he first.**   ti
35a0: 6d 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  me CommitPhaseOn
35b0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
35c0: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a  *.** doNotSpill.
35d0: 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61  **.**   When ena
35e0: 62 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c  bled, cache spil
35f0: 6c 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ls are prohibite
3600: 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
3610: 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 0a 2a 2a  l file cannot.**
3620: 20 20 20 62 65 20 73 79 6e 63 65 64 2e 20 20 54     be synced.  T
3630: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
3640: 73 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20  set and cleared 
3650: 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  by sqlite3PagerW
3660: 72 69 74 65 28 29 20 0a 2a 2a 20 20 20 69 6e 20  rite() .**   in 
3670: 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74  order to prevent
3680: 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20   a journal sync 
3690: 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69  from happening i
36a0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 0a 2a 2a  n between the.**
36b0: 20 20 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f     journalling o
36c0: 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e 20 74  f two pages on t
36d0: 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 20  he same sector. 
36e0: 20 49 74 20 69 73 20 61 6c 73 6f 20 73 65 74 20   It is also set 
36f0: 74 6f 20 70 72 65 76 65 6e 74 0a 2a 2a 20 20 20  to prevent.**   
3700: 70 61 67 65 72 53 74 72 65 73 73 28 29 20 66 72  pagerStress() fr
3710: 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
3720: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 75 72   the journal dur
3730: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
3740: 2a 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a  **.** needSync.*
3750: 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20  *.**   TODO: It 
3760: 6d 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20  might be easier 
3770: 74 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69  to set this vari
3780: 61 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75  able in writeJou
3790: 72 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61  rnalHdr().**   a
37a0: 6e 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nd writeMasterJo
37b0: 75 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68  urnal() only. Ch
37c0: 61 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67  ange its meaning
37d0: 20 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61   to "unsynced da
37e0: 74 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e  ta.**   has been
37f0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
3800: 6a 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20  journal"..**.** 
3810: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
3820: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
3830: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
3840: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
3850: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
3860: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
3870: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
3880: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
3890: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
38a0: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
38b0: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
38c0: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
38d0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
38e0: 72 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75  r files..*/.stru
38f0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
3900: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
3910: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
3920: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
3930: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
3940: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
3950: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3960: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
3970: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
3980: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
3990: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
39a0: 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68       /* On of th
39b0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
39c0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
39d0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39f0: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
3a00: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
3a10: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
3a20: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
3a30: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3a40: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
3a50: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
3a60: 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20  u8 noSync;      
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3a80: 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a  o not sync the j
3a90: 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a  ournal if true *
3aa0: 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b  /.  u8 fullSync;
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ac0: 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63  /* Do extra sync
3ad0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
3ae0: 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20   for robustness 
3af0: 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61  */.  u8 sync_fla
3b00: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
3b10: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f   /* One of SYNC_
3b20: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
3b30: 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ULL */.  u8 temp
3b40: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
3b50: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
3b60: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
3b70: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
3b80: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
3b90: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
3ba0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
3bb0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
3bc0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
3bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3be0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
3bf0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
3c00: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3c10: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
3c20: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
3c30: 72 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61  rs that are dyna
3c40: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64  mically.  ** mod
3c50: 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72  ified during nor
3c60: 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  mal operations. 
3c70: 54 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62  The other variab
3c80: 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75  les in this stru
3c90: 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65  cture.  ** are e
3ca0: 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  ither constant t
3cb0: 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69  hroughout the li
3cc0: 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61  fetime of the pa
3cd0: 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ger, or else.  *
3ce0: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
3cf0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61  configuration pa
3d00: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66  rameters that af
3d10: 66 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65  fect the way the
3d20: 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65   pager .  ** ope
3d30: 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rates..  **.  **
3d40: 20 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72   The 'state' var
3d50: 69 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62  iable is describ
3d60: 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69  ed in more detai
3d70: 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  l along with the
3d80: 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f  .  ** descriptio
3d90: 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73  ns of the values
3da0: 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50   it may take - P
3db0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e  AGER_UNLOCK etc.
3dc0: 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a   Many of the.  *
3dd0: 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  * other variable
3de0: 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20  s in this block 
3df0: 61 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e  are described in
3e00: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72   the comment dir
3e10: 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76  ectly .  ** abov
3e20: 65 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66  e this class def
3e30: 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  inition..  */.  
3e40: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3e60: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
3e70: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
3e80: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62   etc. */.  u8 db
3e90: 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20  Modified;       
3ea0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3eb0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
3ec0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44  changes to the D
3ed0: 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  b */.  u8 needSy
3ee0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
3ef0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
3f00: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
3f10: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
3f20: 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  l */.  u8 journa
3f30: 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20  lStarted;       
3f40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65     /* True if he
3f50: 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ader of journal 
3f60: 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75  is synced */.  u
3f70: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
3f80: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
3f90: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
3fa0: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
3fb0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
3fc0: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
3fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3fe0: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
3ff0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
4000: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20  to jrnl */.  u8 
4010: 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20  doNotSpill;     
4020: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
4030: 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63  ot spill the cac
4040: 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f  he when non-zero
4050: 20 2a 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56   */.  u8 dbSizeV
4060: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
4070: 20 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62    /* Set when db
4080: 53 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20  Size is correct 
4090: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
40a0: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
40b0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
40c0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
40d0: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f  urnals */.  Pgno
40e0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
40f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4100: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
4110: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
4120: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
4130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
4140: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
4150: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
4160: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
4170: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
4180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4190: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
41a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
41b0: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
41d0: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
41e0: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
41f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4210: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
4220: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
4230: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
4240: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
4250: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
4260: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
4270: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
4280: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
4290: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
42a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
42b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
42c0: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
42d0: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
42e0: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
42f0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
4300: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
4310: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
4320: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
4330: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4340: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
4350: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
4360: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
4370: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4380: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
4390: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
43a0: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
43b0: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
43c0: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
43d0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
43e0: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
43f0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
4400: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
4410: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4420: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
4430: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
4440: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
4450: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
4460: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
4470: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
4480: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
4490: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
44a0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
44b0: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
44c0: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
44d0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
44e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
44f0: 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41  aSavepoint; /* A
4500: 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20 73  rray of active s
4510: 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69  avepoints */.  i
4520: 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  nt nSavepoint;  
4530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4540: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4550: 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d   in aSavepoint[]
4560: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
4570: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
4580: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
4590: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
45a0: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ile changes */. 
45b0: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
45d0: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
45e0: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
45f0: 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  ack */..  u16 nE
4600: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
4610: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
4620: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
4630: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
4640: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
4650: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
4660: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4670: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
4680: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
4690: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
46a0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
46b0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
46c0: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
46d0: 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70 61  en() */.  int pa
46e0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
46f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4700: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
4710: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
4720: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4730: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
4740: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
4750: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
4760: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
4770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4780: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
4790: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
47a0: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
47b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
47c0: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
47d0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  l file */.  int 
47e0: 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
47f0: 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74  void*); /* Funct
4800: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e  ion to call when
4810: 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20   busy */.  void 
4820: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
4830: 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78  ;      /* Contex
4840: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78  t argument for x
4850: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23  BusyHandler */.#
4860: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
4870: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
4880: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
4890: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
48a0: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
48b0: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
48c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
48d0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
48e0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
48f0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
4900: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
4910: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
4920: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
4930: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
4940: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
4950: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
4960: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
4970: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
4980: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
4990: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
49a0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
49b0: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
49c0: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
49d0: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
49e0: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
49f0: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
4a00: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
4a10: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
4a20: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
4a30: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
4a40: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
4a50: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
4a60: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
4a70: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
4a80: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
4a90: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
4aa0: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
4ab0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
4ac0: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
4ad0: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
4ae0: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
4af0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
4b00: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
4b10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61   */.  sqlite3_ba
4b20: 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20  ckup *pBackup;  
4b30: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
4b40: 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20  list of ongoing 
4b50: 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73  backup processes
4b60: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
4b70: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
4b80: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
4b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
4ba0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
4bb0: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
4bc0: 64 65 3d 77 61 6c 22 20 2a 2f 0a 23 65 6e 64 69  de=wal" */.#endi
4bd0: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f.};../*.** The 
4be0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
4bf0: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
4c00: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
4c10: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
4c20: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
4c30: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
4c40: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
4c50: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
4c60: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
4c70: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
4c80: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
4c90: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
4ca0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
4cb0: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
4cc0: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
4cd0: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
4ce0: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
4cf0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4d00: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
4d10: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
4d20: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
4d30: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
4d40: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
4d50: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
4d60: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
4d70: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
4d80: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
4d90: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
4da0: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
4db0: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
4dc0: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
4dd0: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
4de0: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
4df0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
4e00: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
4e10: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
4e20: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
4e30: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
4e40: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
4e50: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
4e60: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
4e70: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
4e80: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
4e90: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
4ea0: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
4eb0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
4ec0: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
4ed0: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
4ee0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
4ef0: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
4f00: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
4f10: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
4f20: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
4f30: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
4f40: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
4f50: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
4f60: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
4f70: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
4f80: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
4f90: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
4fa0: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
4fb0: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
4fc0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
4fd0: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
4fe0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
4ff0: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
5000: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
5010: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
5020: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
5030: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
5040: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
5050: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
5060: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
5070: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
5080: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
5090: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
50a0: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
50b0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
50c0: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
50d0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
50e0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
50f0: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
5100: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
5110: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
5120: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
5130: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
5140: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
5150: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
5160: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
5170: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
5180: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
5190: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
51a0: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
51b0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
51c0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
51d0: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
51e0: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
51f0: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
5200: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
5210: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
5220: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
5230: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
5240: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
5250: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
5260: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
5270: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
5280: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
5290: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
52a0: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
52b0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
52c0: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
52d0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
52e0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
52f0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5300: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
5310: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
5320: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
5330: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
5340: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
5350: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
5360: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
5370: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
5380: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
5390: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
53a0: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
53b0: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
53c0: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
53d0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
53e0: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
53f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
5400: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
5410: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
5420: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
5430: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
5440: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
5450: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
5460: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
5470: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
5480: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
5490: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
54a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
54b0: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
54c0: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
54d0: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
54e0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
54f0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
5500: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
5510: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
5520: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
5530: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
5540: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
5550: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
5560: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
5570: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
5580: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
5590: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
55a0: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
55b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
55c0: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
55d0: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
55e0: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
55f0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
5600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
5610: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
5620: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
5630: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
5640: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
5650: 34 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65  47483647..#ifnde
5660: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
5670: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
5680: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
5690: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
56a0: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
56b0: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
56c0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
56d0: 67 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65  ger){..  /* A te
56e0: 6d 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79  mp-file is alway
56f0: 73 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55  s in PAGER_EXCLU
5700: 53 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59  SIVE or PAGER_SY
5710: 4e 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  NCED state. */. 
5720: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
5730: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
5740: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
5750: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
5760: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  ;..  /* The chan
5770: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
5780: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66   is always set f
5790: 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f  or temp-files */
57a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
57b0: 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  r->tempFile==0 |
57c0: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
57d0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
57e0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
57f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
5800: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
5810: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
5820: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
5830: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
5840: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
5850: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
5860: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
5870: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
5880: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
5890: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
58a0: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
58b0: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
58c0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
58d0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
58e0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
58f0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
5900: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
5910: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
5920: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
5930: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
5940: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
5950: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
5960: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
5970: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
5980: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f  dr *pPg){.  Pgno
5990: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
59a0: 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
59b0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
59c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
59d0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e  (i=0; i<pPager->
59e0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29  nSavepoint; i++)
59f0: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
5a00: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
5a10: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d  r->aSavepoint[i]
5a20: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72  ;.    if( p->nOr
5a30: 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73  ig>=pgno && 0==s
5a40: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
5a50: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
5a60: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
5a70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
5a80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5a90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5aa0: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
5ab0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
5ac0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5ae0: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67  pageInJournal(Pg
5af0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  Hdr *pPg){.  ret
5b00: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
5b10: 63 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65  cTest(pPg->pPage
5b20: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
5b30: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  Pg->pgno);.}../*
5b40: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
5b50: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
5b60: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
5b70: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
5b80: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
5b90: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
5ba0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
5bb0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
5bc0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
5bd0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
5be0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
5bf0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
5c00: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
5c10: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
5c20: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
5c30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5c40: 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f  d32bits(sqlite3_
5c50: 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66  file *fd, i64 of
5c60: 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29  fset, u32 *pRes)
5c70: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
5c80: 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72  r ac[4];.  int r
5c90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5ca0: 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66  d(fd, ac, sizeof
5cb0: 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20  (ac), offset);. 
5cc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5cd0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
5ce0: 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
5cf0: 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(ac);.  }.  ret
5d00: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5d10: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
5d20: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73  integer into a s
5d30: 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20  tring buffer in 
5d40: 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20  big-endian byte 
5d50: 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  order..*/.#defin
5d60: 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29  e put32bits(A,B)
5d70: 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74    sqlite3Put4byt
5d80: 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a  e((u8*)A,B)../*.
5d90: 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69  ** Write a 32-bi
5da0: 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74  t integer into t
5db0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
5dc0: 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72  scriptor.  Retur
5dd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
5de0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
5df0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
5e00: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5e10: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
5e20: 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71  t write32bits(sq
5e30: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
5e40: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
5e50: 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b  val){.  char ac[
5e60: 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  4];.  put32bits(
5e70: 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75  ac, val);.  retu
5e80: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
5e90: 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66  e(fd, ac, 4, off
5ea0: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  set);.}../*.** T
5eb0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
5ec0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
5ed0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
5ee0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
5ef0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
5f00: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
5f10: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
5f20: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
5f30: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
5f40: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
5f50: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
5f60: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
5f70: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
5f80: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
5f90: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
5fa0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
5fb0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
5fc0: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
5fd0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
5fe0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
5ff0: 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  ods)../*.** If f
6000: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
6010: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
6020: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
6030: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
6040: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
6050: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
6060: 63 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70  ck){.  if( !isOp
6070: 65 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72  en(pFd) ){.    r
6080: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6090: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
60a0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46  lite3OsUnlock(pF
60b0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a  d, eLock);.}../*
60c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
60d0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
60e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
60f0: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
6100: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
6110: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
6120: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
6130: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
6140: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
6150: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
6160: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
6170: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
6180: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
6190: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
61a0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
61b0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
61c0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
61d0: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
61e0: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
61f0: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
6200: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
6210: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
6220: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
6230: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
6240: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
6250: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
6260: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
6270: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
6280: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
6290: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
62a0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
62b0: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
62c0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
62d0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
62e0: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
62f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
6300: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
6310: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
6320: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
6330: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
6340: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
6350: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
6360: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
6370: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
6380: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
6390: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
63a0: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
63b0: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
63c0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
63d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
63e0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
63f0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
6400: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6420: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
6430: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
6440: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
6450: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
6460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
6470: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
6480: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64a0: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
64b0: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
64c0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
64d0: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
64e0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
64f0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
6500: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
6510: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
6520: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
6530: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
6540: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
6550: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
6560: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
6570: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
6580: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
6590: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
65a0: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
65b0: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
65c0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
65d0: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
65e0: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
65f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
6600: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
6610: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
6620: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
6630: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
6640: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
6650: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
6660: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
6670: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
6680: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
6690: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
66a0: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
66b0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
66c0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
66d0: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
66e0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
66f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
6700: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
6710: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
6720: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
6730: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
6740: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
6750: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
6760: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
6770: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
6780: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
6790: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
67a0: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
67b0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
67c0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
67d0: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
67e0: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
67f0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
6800: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
6810: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
6820: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
6830: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
6840: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
6850: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
6860: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
6870: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
6880: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
6890: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
68a0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
68b0: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
68c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
68d0: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
68e0: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
68f0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
6900: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
6910: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
6920: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
6930: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
6940: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
6950: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
6960: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
6970: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
6980: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
6990: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
69a0: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
69b0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
69c0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
69d0: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
69e0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
69f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
6a00: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
6a10: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
6a20: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
6a30: 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  er->errCode.    
6a40: 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73    || (pPg->flags
6a50: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
6a60: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
6a70: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
6a80: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
6a90: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
6aa0: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
6ab0: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
6ac0: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
6ad0: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
6ae0: 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  ).#endif  /* SQL
6af0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
6b00: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  */../*.** When t
6b10: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
6b20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
6b30: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
6b40: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
6b50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6b60: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20  ttempts to read 
6b70: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
6b80: 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20   file name from 
6b90: 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74  the .** end of t
6ba0: 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20  he file and, if 
6bb0: 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69  successful, copi
6bc0: 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  es it into memor
6bd0: 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62  y supplied .** b
6be0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65  y the caller. Se
6bf0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
6c00: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
6c10: 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f  nal() for the fo
6c20: 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20  rmat.** used to 
6c30: 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a  store a master j
6c40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6c50: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
6c60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
6c70: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
6c80: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
6c90: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
6ca0: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
6cb0: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
6cc0: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
6cd0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
6ce0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
6cf0: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
6d00: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
6d10: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
6d20: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6d30: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
6d40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
6d50: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
6d60: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
6d70: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
6d80: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
6d90: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
6da0: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
6db0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
6dc0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
6dd0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
6de0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
6df0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rnal..**.** If a
6e00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6e10: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6e20: 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20  sent at the end 
6e30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  of the journal.*
6e40: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  * file, then it 
6e50: 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74  is copied into t
6e60: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
6e70: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e  d to by zMaster.
6e80: 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   A.** nul-termin
6e90: 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70  ator byte is app
6ea0: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
6eb0: 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  fer following th
6ec0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
6ed0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a  nal file name..*
6ee0: 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65  *.** If it is de
6ef0: 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f  termined that no
6f00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6f10: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6f20: 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72  sent .** zMaster
6f30: 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20  [0] is set to 0 
6f40: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
6f50: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
6f60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6f70: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66   while reading f
6f80: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
6f90: 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a  file, an SQLite.
6fa0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
6fb0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
6fc0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
6fd0: 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74  terJournal(sqlit
6fe0: 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  e3_file *pJrnl, 
6ff0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75  char *zMaster, u
7000: 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69  32 nMaster){.  i
7010: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7030: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33  urn code */.  u3
7040: 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  2 len;          
7050: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
7060: 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d  th in bytes of m
7070: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7080: 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b  me */.  i64 szJ;
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
70b0: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75   in bytes of jou
70c0: 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20  rnal file pJrnl 
70d0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76  /* MJ checksum v
7100: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a  alue read from j
7110: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
7120: 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
7130: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
7140: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
7150: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
7160: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
7170: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
7180: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
7190: 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  ader */.  zMaste
71a0: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
71b0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
71c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
71d0: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
71e0: 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31  zJ)).   || szJ<1
71f0: 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  6.   || SQLITE_O
7200: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
7210: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
7220: 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20  6, &len)).   || 
7230: 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20  len>=nMaster .  
7240: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
7250: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7260: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
7270: 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51  cksum)).   || SQ
7280: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
7290: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
72a0: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
72b0: 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d  zJ-8)).   || mem
72c0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
72d0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20  rnalMagic, 8).  
72e0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
72f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7300: 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65  ad(pJrnl, zMaste
7310: 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c  r, len, szJ-16-l
7320: 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  en)).  ){.    re
7330: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
7340: 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68  /* See if the ch
7350: 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74  ecksum matches t
7360: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7370: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28  l name */.  for(
7380: 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29  u=0; u<len; u++)
7390: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a  {.    cksum -= z
73a0: 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20  Master[u];.  }. 
73b0: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
73c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
73d0: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
73e0: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
73f0: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
7400: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
7410: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7420: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
7430: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
7440: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
7450: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
7460: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
7470: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
7480: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
7490: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
74a0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
74b0: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
74c0: 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20  .    len = 0;.  
74d0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
74e0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72   = '\0';.   .  r
74f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7500: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7510: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
7520: 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  he sector bounda
7530: 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61  ry at or immedia
7540: 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  tely .** followi
7550: 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ng the value in 
7560: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7570: 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73  ff, assuming a s
7580: 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f  ector .** size o
7590: 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  f pPager->sector
75a0: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
75b0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
75c0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
75d0: 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f  **.**   Pager.jo
75e0: 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20  urnalOff        
75f0: 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a    Return value.*
7600: 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
7610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
7630: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
7640: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
7650: 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20    512           
7660: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
7670: 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20  **   100        
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
7690: 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20  12.**   2000    
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76b0: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
76c0: 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c  atic i64 journal
76d0: 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20  HdrOffset(Pager 
76e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
76f0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
7700: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
7710: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
7720: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
7730: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
7740: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7750: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
7760: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
7770: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
7780: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
7790: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
77a0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
77b0: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
77c0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
77d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
77e0: 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
77f0: 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  offset;.}../*.**
7800: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
7810: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
7820: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
7830: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
7840: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
7850: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
7860: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7870: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69  has not been wri
7880: 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69  tten to.** withi
7890: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
78a0: 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20  ansaction (i.e. 
78b0: 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  if Pager.journal
78c0: 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  Off==0)..**.** I
78d0: 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20  f doTruncate is 
78e0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20  non-zero or the 
78f0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
7900: 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20  eLimit variable 
7910: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20  is.** set to 0, 
7920: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
7930: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
7940: 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
7950: 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  size. Otherwise,
7960: 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d  .** zero the 28-
7970: 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74  byte header at t
7980: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
7990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e  journal file. In
79a0: 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a   either case, .*
79b0: 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
79c0: 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  s not in no-sync
79d0: 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
79e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d  journal file imm
79f0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74  ediately .** aft
7a00: 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72  er writing or tr
7a10: 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a  uncating it..**.
7a20: 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72  ** If Pager.jour
7a30: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20  nalSizeLimit is 
7a40: 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76  set to a positiv
7a50: 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  e, non-zero valu
7a60: 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  e, and.** follow
7a70: 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69  ing the truncati
7a80: 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65  on or zeroing de
7a90: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68  scribed above th
7aa0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a  e size of the .*
7ab0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
7ac0: 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65  n bytes is large
7ad0: 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
7ae0: 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  e, then truncate
7af0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
7b00: 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f  file to Pager.jo
7b10: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62  urnalSizeLimit b
7b20: 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ytes. The journa
7b30: 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
7b40: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79  ot need to be sy
7b50: 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  nced following t
7b60: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  his operation..*
7b70: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
7b80: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e  ror occurs, aban
7b90: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
7ba0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f  nd return the IO
7bb0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
7bc0: 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
7bd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
7be0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
7bf0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
7c00: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
7c10: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
7c20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c50: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7c60: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
7c70: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
7c80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7c90: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
7ca0: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
7cb0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
7cc0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
7cd0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
7ce0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
7cf0: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
7d00: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
7d10: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
7d20: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
7d30: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
7d40: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
7d50: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
7d60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
7d70: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
7d80: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
7d90: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
7da0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
7db0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
7dc0: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
7dd0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
7de0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
7df0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
7e00: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
7e10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7e20: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
7e30: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
7e40: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
7e50: 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
7e60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
7e70: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
7e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
7e90: 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65  ommitted but the
7ea0: 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20   write lock .   
7eb0: 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c   ** is still hel
7ec0: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  d on the file. I
7ed0: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a  f there is a siz
7ee0: 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72  e limit configur
7ef0: 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74  ed for .    ** t
7f00: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
7f10: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f  urnal and the jo
7f20: 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
7f30: 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f  ntly consumes mo
7f40: 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  re.    ** space 
7f50: 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20  than that limit 
7f60: 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e  allows for, trun
7f70: 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
7f80: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
7f90: 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65    ** to sync the
7fa0: 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   file following 
7fb0: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
7fc0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
7fd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
7fe0: 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  iLimit>0 ){.    
7ff0: 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20    i64 sz;.      
8000: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
8010: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
8020: 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  fd, &sz);.      
8030: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8040: 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29  K && sz>iLimit )
8050: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
8060: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
8070: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c  (pPager->jfd, iL
8080: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
8090: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
80a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
80b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
80c0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
80d0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
80e0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
80f0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
8100: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
8110: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
8120: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
8130: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
8140: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
8150: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
8160: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
8170: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
8180: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
8190: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
81a0: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
81b0: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
81c0: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
81d0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
81e0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
81f0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
8200: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
8210: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
8220: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
8230: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
8240: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
8250: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
8260: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
8270: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
8280: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
8290: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
82a0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
82b0: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
82c0: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
82d0: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
82e0: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
82f0: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
8300: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
8310: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
8320: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8330: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8340: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
8350: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
8360: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
8370: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
8380: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f  r->pTmpSpace;  /
8390: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63  * Temporary spac
83a0: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  e used to build 
83b0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
83c0: 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  nHeader = pPager
83d0: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  ->pageSize;     
83e0: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
83f0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
8400: 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32  zHeader */.  u32
8410: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8430: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61   /* Bytes of hea
8440: 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74  der sector writt
8450: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  en */.  int ii; 
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8480: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8490: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
84a0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
84b0: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
84c0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
84d0: 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48  en. */..  if( nH
84e0: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
84f0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
8500: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
8510: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
8520: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
8530: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
8540: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
8550: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77  nd any of them w
8560: 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a  ere created .  *
8570: 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74  * since the most
8580: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
8590: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
85a0: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a  en, update the .
85b0: 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
85c0: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
85d0: 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ields now..  */.
85e0: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
85f0: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
8600: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t; ii++){.    if
8610: 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  ( pPager->aSavep
8620: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
8630: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
8640: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
8650: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
8660: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
8670: 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
8680: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
8690: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
86a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
86b0: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
86c0: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a  pPager);..  /* .
86d0: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
86e0: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
86f0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
8700: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
8710: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
8720: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
8730: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
8740: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
8750: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
8760: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
8770: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
8780: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
8790: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
87a0: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
87b0: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
87c0: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
87d0: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
87e0: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
87f0: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
8800: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
8810: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
8820: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
8830: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
8840: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
8850: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
8860: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
8870: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
8880: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
8890: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
88a0: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
88b0: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
88c0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
88d0: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
88e0: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
88f0: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
8900: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
8910: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
8920: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
8930: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
8940: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
8950: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
8960: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
8970: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
8980: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
8990: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
89a0: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
89b0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
89c0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
89d0: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
89e0: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
89f0: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
8a00: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
8a10: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
8a20: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
8a30: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
8a40: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
8a50: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
8a60: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
8a70: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
8a80: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
8a90: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
8aa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
8ab0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
8ac0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
8ad0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
8ae0: 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  nc );.  if( (pPa
8af0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20  ger->noSync) || 
8b00: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
8b10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
8b20: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
8b30: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
8b40: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
8b50: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
8b60: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
8b70: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
8b80: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
8b90: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
8ba0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
8bb0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
8bc0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
8bd0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
8be0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
8bf0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
8c00: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
8c10: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
8c20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
8c30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
8c40: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
8c50: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
8c60: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
8c70: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
8c80: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8c90: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
8ca0: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
8cb0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8cc0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8cd0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
8ce0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
8cf0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
8d00: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
8d10: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
8d20: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
8d30: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
8d40: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
8d50: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
8d60: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
8d70: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
8d80: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
8d90: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
8da0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
8db0: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
8dc0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
8dd0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
8de0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8df0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8e00: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
8e10: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
8e20: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
8e30: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
8e40: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
8e50: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
8e60: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
8e70: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
8e80: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
8e90: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
8ea0: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
8eb0: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
8ec0: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
8ed0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
8ee0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
8ef0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
8f00: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
8f10: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
8f20: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
8f30: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8f40: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
8f50: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
8f60: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
8f70: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
8f80: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
8f90: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
8fa0: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
8fb0: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
8fc0: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
8fd0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
8fe0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
8ff0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
9000: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
9010: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
9020: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
9030: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
9040: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
9050: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
9060: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
9070: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
9080: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
9090: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
90a0: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
90b0: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
90c0: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
90d0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
90e0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
90f0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
9100: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
9110: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
9120: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
9130: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
9140: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
9150: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
9160: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
9170: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
9180: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
9190: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
91a0: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
91b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
91c0: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
91d0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
91e0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
91f0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
9200: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
9210: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
9220: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
9230: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
9240: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
9250: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
9260: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
9270: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
9280: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
9290: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
92a0: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
92b0: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
92c0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
92d0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
92e0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
92f0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
9300: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
9310: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
9320: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
9330: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
9340: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
9350: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
9360: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
9370: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
9380: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
9390: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
93a0: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
93b0: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
93c0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
93d0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
93e0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
93f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
9400: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9410: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
9420: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9430: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
9440: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9450: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
9460: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9470: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
9480: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
9490: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
94a0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
94b0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
94c0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
94d0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
94e0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
94f0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
9500: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
9510: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
9520: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
9530: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
9540: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
9550: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
9560: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
9570: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
9580: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
9590: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
95a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
95b0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
95c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
95d0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
95e0: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
95f0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
9600: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
9610: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
9620: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
9630: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
9640: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
9650: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
9660: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
9670: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
9680: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
9690: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
96a0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
96b0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
96c0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
96d0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
96e0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
96f0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
9700: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
9710: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
9720: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
9730: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
9740: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
9750: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
9760: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
9770: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
9780: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
9790: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
97a0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
97b0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
97c0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
97d0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
97e0: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
97f0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
9800: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
9810: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
9820: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
9830: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
9840: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
9850: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
9860: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
9870: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
9880: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
98a0: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
98b0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
98c0: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
98d0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
98e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
98f0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
9900: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
9910: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
9920: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
9930: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
9940: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
9950: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
9960: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
9970: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
9980: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
9990: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
99c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
99d0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
99e0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
99f0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
9a00: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
9a10: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
9a20: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
9a30: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
9a40: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
9a50: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
9a60: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
9a70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
9a80: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
9a90: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
9aa0: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
9ab0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
9ac0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
9ad0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
9ae0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
9af0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
9b00: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
9b10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
9b20: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
9b30: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
9b40: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
9b50: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
9b60: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
9b70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9b80: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
9b90: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
9ba0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
9bb0: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
9bc0: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
9bd0: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
9be0: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
9bf0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
9c00: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
9c10: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
9c20: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
9c30: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
9c40: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
9c50: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
9c60: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
9c70: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
9c80: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
9c90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
9ca0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
9cb0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
9cc0: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
9cd0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
9ce0: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
9cf0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
9d00: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
9d10: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
9d20: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
9d30: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
9d40: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
9d50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
9d60: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
9d70: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
9d80: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
9d90: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
9da0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
9db0: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
9dc0: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
9dd0: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
9de0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
9df0: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
9e00: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
9e10: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
9e20: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
9e30: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
9e40: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
9e50: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
9e60: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
9e70: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9e80: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
9e90: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9ea0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9eb0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9ec0: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
9ed0: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
9ee0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9ef0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9f00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9f10: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
9f20: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
9f30: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
9f40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9f50: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
9f60: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
9f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
9f80: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
9f90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
9fa0: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
9fb0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
9fc0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
9fd0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
9fe0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
9ff0: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
a000: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
a010: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
a020: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
a030: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
a040: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
a050: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
a060: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
a070: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
a080: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
a090: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
a0a0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
a0b0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
a0c0: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
a0d0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
a0e0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a0f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
a100: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
a110: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
a120: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
a130: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
a140: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
a150: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
a160: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
a170: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
a180: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
a190: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
a1a0: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
a1b0: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
a1c0: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
a1d0: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
a1e0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
a1f0: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
a200: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
a210: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
a220: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
a230: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
a240: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
a250: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
a260: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
a270: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
a280: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
a290: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
a2a0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
a2b0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
a2c0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
a2d0: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
a2e0: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
a2f0: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
a300: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
a310: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
a320: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
a330: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
a340: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
a350: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
a360: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
a370: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
a380: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
a390: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
a3a0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
a3b0: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
a3c0: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
a3d0: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
a3e0: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
a3f0: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
a400: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
a410: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
a420: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
a430: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a440: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
a450: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
a460: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
a470: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
a480: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a490: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
a4a0: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
a4b0: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
a4c0: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
a4d0: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
a4e0: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
a4f0: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
a500: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67  .    */.    iPag
a510: 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69  eSize16 = (u16)i
a520: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
a530: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
a540: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
a550: 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c  r, &iPageSize16,
a560: 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
a570: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
a580: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
a590: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a5a0: 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28  | iPageSize16==(
a5b0: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
a5c0: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
a5d0: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
a5e0: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
a5f0: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
a600: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
a610: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
a620: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
a630: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
a640: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
a650: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
a660: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
a670: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
a680: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
a690: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
a6a0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
a6b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
a6c0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
a6d0: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
a6e0: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
a6f0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
a700: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
a710: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
a720: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
a730: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
a740: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
a750: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
a760: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
a770: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a780: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a790: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a7a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a7b0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a7c0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a7d0: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a7e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a7f0: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a800: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a810: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a820: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a830: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a840: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a850: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a860: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a870: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a880: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a890: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a8a0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a8b0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a8c0: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a8d0: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
a8e0: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
a8f0: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
a900: 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
a910: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
a920: 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
a930: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
a940: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
a950: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
a960: 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
a970: 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
a980: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
a990: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
a9a0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
a9b0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
a9c0: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
a9d0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
a9e0: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
a9f0: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
aa00: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
aa10: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
aa20: 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
aa30: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
aa40: 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
aa50: 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
aa60: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
aa70: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
aa80: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
aa90: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
aaa0: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
aab0: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
aac0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
aad0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
aae0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
aaf0: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
ab00: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
ab10: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ab40: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
ab50: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
ab60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
ab70: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
ab80: 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
ab90: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
abb0: 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
abc0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
abd0: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
abe0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
abf0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ac00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
ac10: 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
ac20: 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
ac40: 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
ac50: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
ac60: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
ac70: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
ac80: 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  r.   || pPager->
ac90: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
aca0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
acb0: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
acc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
acd0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ace0: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
acf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ad00: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
ad10: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
ad20: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
ad30: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
ad40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ad50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
ad60: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ad70: 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  lOff );..  /* Ca
ad80: 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67  lculate the leng
ad90: 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20  th in bytes and 
ada0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  the checksum of 
adb0: 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72  zMaster */.  for
adc0: 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73  (nMaster=0; zMas
add0: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d  ter[nMaster]; nM
ade0: 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b  aster++){.    ck
adf0: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e  sum += zMaster[n
ae00: 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20  Master];.  }..  
ae10: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
ae20: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
ae30: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
ae40: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
ae50: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
ae60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ae70: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
ae80: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
ae90: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
aea0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
aeb0: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
aec0: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
aed0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
aee0: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
aef0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
af00: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
af10: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
af20: 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70   }.  iHdrOff = p
af30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
af40: 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  f;..  /* Write t
af50: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
af60: 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e  l data to the en
af70: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
af80: 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61   file. If.  ** a
af90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
afa0: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
afb0: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
afc0: 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ler..  */.  if( 
afd0: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
afe0: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
aff0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41  jfd, iHdrOff, PA
b000: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
b010: 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  er)))).   || (0 
b020: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
b030: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
b040: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d  jfd, zMaster, nM
b050: 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34  aster, iHdrOff+4
b060: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
b070: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
b080: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
b090: 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
b0a0: 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20  , nMaster))).   
b0b0: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
b0c0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
b0d0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
b0e0: 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73  4+nMaster+4, cks
b0f0: 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  um))).   || (0 !
b100: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
b110: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
b120: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
b130: 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b  c, 8, iHdrOff+4+
b140: 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
b150: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
b160: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
b170: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
b180: 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61  aster+20);.  pPa
b190: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
b1a0: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
b1b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
b1c0: 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
b1d0: 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
b1e0: 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
b1f0: 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
b200: 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
b210: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
b220: 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
b230: 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
b240: 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
b250: 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
b260: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
b270: 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
b280: 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
b290: 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
b2a0: 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
b2b0: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
b2c0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
b2d0: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
b2e0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
b2f0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
b300: 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
b310: 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
b320: 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
b330: 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
b340: 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
b350: 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
b360: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
b370: 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
b380: 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
b390: 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53  e..  */ .  if( S
b3a0: 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
b3b0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
b3c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
b3d0: 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26  jrnlSize)).   &&
b3e0: 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72   jrnlSize>pPager
b3f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29  ->journalOff.  )
b400: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b410: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
b420: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
b430: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
b440: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b450: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
b460: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
b470: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
b480: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65   page number. Re
b490: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
b4a0: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72  r to the page or
b4b0: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71   NULL if the req
b4c0: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
b4d0: 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  ot .** already i
b4e0: 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  n memory..*/.sta
b4f0: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
b500: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
b510: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
b520: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20  ){.  PgHdr *p;  
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
b550: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20   value */..  /* 
b560: 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
b570: 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f  le for a call to
b580: 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77   PcacheFetch() w
b590: 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
b5a0: 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20  0 to.  ** fail, 
b5b0: 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74  since no attempt
b5c0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e   to allocate dyn
b5d0: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  amic memory will
b5e0: 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20   be made..  */. 
b5f0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63   (void)sqlite3Pc
b600: 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
b610: 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
b620: 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72   0, &p);.  retur
b630: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
b640: 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
b650: 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  s in error-state
b660: 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  , discard all in
b670: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49  -memory pages. I
b680: 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69  f.** the pager i
b690: 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  s in error-state
b6a0: 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c  , then this call
b6b0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
b6c0: 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e  ** TODO: Why can
b6d0: 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68   we not reset th
b6e0: 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e  e pager while in
b6f0: 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f   error state?.*/
b700: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b710: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
b720: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53  pPager){.  if( S
b730: 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72  QLITE_OK==pPager
b740: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b750: 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
b760: 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
b770: 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69  ackup);.    sqli
b780: 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
b790: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
b7a0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
b7b0: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
b7c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
b7d0: 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
b7e0: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
b7f0: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  epoint[] array a
b800: 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50  nd set both.** P
b810: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
b820: 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70  and Pager.nSavep
b830: 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c  oint to zero. Cl
b840: 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ose the sub-jour
b850: 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  nal.** if it is 
b860: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
b870: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
b880: 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a  lusive mode..*/.
b890: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
b8a0: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
b8b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b8c0: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
b8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
b8e0: 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67  ator for looping
b8f0: 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61   through Pager.a
b900: 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66  Savepoint */.  f
b910: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
b920: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
b930: 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ii++){.    sqlit
b940: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
b950: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b960: 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
b970: 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  int);.  }.  if( 
b980: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
b990: 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65  veMode || sqlite
b9a0: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
b9b0: 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
b9c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
b9d0: 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  e(pPager->sjfd);
b9e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
b9f0: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76  ree(pPager->aSav
ba00: 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65  epoint);.  pPage
ba10: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
ba20: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  0;.  pPager->nSa
ba30: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
ba40: 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d  Pager->nSubRec =
ba50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
ba60: 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20   the bit number 
ba70: 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65  pgno in the Page
ba80: 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
ba90: 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76  vepoint .** bitv
baa0: 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20  ecs of all open 
bab0: 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75  savepoints. Retu
bac0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
bad0: 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72  successful.** or
bae0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
baf0: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
bb00: 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  e occurs..*/.sta
bb10: 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76  tic int addToSav
bb20: 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61  epointBitvecs(Pa
bb30: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
bb40: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69  o pgno){.  int i
bb50: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
bb60: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
bb70: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
bb80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
bb90: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
bba0: 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d  de */..  for(ii=
bbb0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
bbc0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
bbd0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
bbe0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
bbf0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
bc00: 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  ;.    if( pgno<=
bc10: 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  p->nOrig ){.    
bc20: 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42    rc |= sqlite3B
bc30: 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53  itvecSet(p->pInS
bc40: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b  avepoint, pgno);
bc50: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bc60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
bc70: 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  M );.      asser
bc80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
bc90: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
bca0: 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20  OMEM );.    }.  
bcb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bcc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
bcd0: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
bce0: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
bcf0: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
bd00: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
bd10: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
bd20: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
bd30: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
bd40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
bd50: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
bd60: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
bd70: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
bd80: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
bd90: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
bda0: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
bdb0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
bdc0: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
bdd0: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
bde0: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
bdf0: 2c 79 2c 7a 29 20 30 0a 23 20 64 65 66 69 6e 65  ,y,z) 0.# define
be00: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
be10: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
be20: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
be30: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
be40: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
be50: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
be60: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
be70: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
be80: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
be90: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
bea0: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
beb0: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
bec0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
bed0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
bee0: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
bef0: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
bf00: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
bf10: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
bf20: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
bf30: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
bf40: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
bf50: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
bf60: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
bf70: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
bf80: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
bf90: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
bfa0: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
bfb0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
bfc0: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
bfd0: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
bfe0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
bff0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
c000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c010: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
c020: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
c030: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
c040: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
c050: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c060: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
c070: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20  turn code */.   
c080: 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65   int iDc = isOpe
c090: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71  n(pPager->fd)?sq
c0a0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
c0b0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
c0c0: 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20  ger->fd):0;..   
c0d0: 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61   /* If the opera
c0e0: 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70  ting system supp
c0f0: 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20  ort deletion of 
c100: 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e  open files, then
c110: 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68  .    ** close th
c120: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
c130: 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65  hen dropping the
c140: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20   database lock. 
c150: 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
c160: 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  * another connec
c170: 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61  tion with journa
c180: 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69  l_mode=delete mi
c190: 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66  ght delete the f
c1a0: 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66  ile.    ** out f
c1b0: 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20  rom under us..  
c1c0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
c1d0: 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
c1e0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35  ODE_MEMORY   & 5
c1f0: 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
c200: 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
c210: 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20  ALMODE_OFF      
c220: 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
c230: 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
c240: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
c250: 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
c260: 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
c270: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
c280: 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b  ETE   & 5)!=1 );
c290: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
c2a0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c2b0: 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31  TRUNCATE & 5)==1
c2c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c2d0: 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
c2e0: 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29  DE_PERSIST  & 5)
c2f0: 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30  ==1 );.    if( 0
c300: 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ==(iDc & SQLITE_
c310: 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
c320: 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20  E_WHEN_OPEN).   
c330: 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d    || 1!=(pPager-
c340: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35  >journalMode & 5
c350: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
c360: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c370: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
c380: 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  }..    sqlite3Bi
c390: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
c3a0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
c3b0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
c3c0: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
c3d0: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
c3e0: 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
c3f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
c400: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20  le is unlocked, 
c410: 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69  somebody else mi
c420: 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54  ght change it. T
c430: 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  he.    ** values
c440: 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
c450: 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67  .dbSize etc. mig
c460: 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  ht become invali
c470: 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73  d if.    ** this
c480: 20 68 61 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63   happens.  One c
c490: 61 6e 20 61 72 67 75 65 20 74 68 61 74 20 74 68  an argue that th
c4a0: 69 73 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20  is doesn't need 
c4b0: 74 6f 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20  to be cleared.  
c4c0: 20 20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63    ** until the c
c4d0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68  hange-counter ch
c4e0: 65 63 6b 20 66 61 69 6c 73 20 69 6e 20 50 61 67  eck fails in Pag
c4f0: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a  erSharedLock()..
c500: 20 20 20 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20      ** Clearing 
c510: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 61  the page size ca
c520: 63 68 65 20 68 65 72 65 20 69 73 20 62 65 69 6e  che here is bein
c530: 67 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a  g conservative..
c540: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
c550: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
c560: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   0;..    if( pag
c570: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c580: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c590: 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
c5a0: 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
c5b0: 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
c5c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 55 6e  .      rc = osUn
c5d0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
c5e0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d   NO_LOCK);.    }
c5f0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
c600: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c610: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
c620: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
c630: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
c640: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
c650: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
c660: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
c670: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
c680: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
c690: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
c6a0: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
c6b0: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
c6c0: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
c6d0: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
c6e0: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
c6f0: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
c700: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
c710: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
c720: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
c730: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
c740: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c750: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c760: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
c770: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c780: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
c790: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
c7a0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
c7b0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
c7c0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
c7d0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
c7e0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50  R_UNLOCK;.    pP
c7f0: 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
c800: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
c810: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c820: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
c830: 64 20 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c  d when an IOERR,
c840: 20 43 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c   CORRUPT or FULL
c850: 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61   error.** may ha
c860: 76 65 20 6f 63 63 75 72 72 65 64 2e 20 54 68 65  ve occurred. The
c870: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
c880: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c890: 74 68 65 20 70 61 67 65 72 20 0a 2a 2a 20 73 74  the pager .** st
c8a0: 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
c8b0: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
c8c0: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
c8d0: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
c8e0: 65 72 20 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74  er .** API funct
c8f0: 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
c900: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
c910: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
c920: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
c930: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
c940: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
c950: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
c960: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
c970: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
c980: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
c990: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
c9a0: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
c9b0: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
c9c0: 6e 74 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  nt error is clea
c9d0: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
c9e0: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
c9f0: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
ca00: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
ca10: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
ca20: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
ca30: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
ca40: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
ca50: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
ca60: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
ca70: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
ca80: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
ca90: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
caa0: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
cab0: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
cac0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
cad0: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
cae0: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
caf0: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
cb00: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
cb10: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
cb20: 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
cb30: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
cb40: 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
cb50: 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
cb60: 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
cb70: 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
cb80: 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
cb90: 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
cba0: 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
cbb0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
cbc0: 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
cbd0: 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
cbe0: 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
cbf0: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
cc00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
cc10: 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
cc20: 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
cc30: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
cc40: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
cc50: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
cc60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
cc70: 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
cc80: 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
cc90: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
cca0: 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
ccb0: 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
ccc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
ccd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
cce0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
ccf0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cd00: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
cd10: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
cd20: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
cd30: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
cd40: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
cd50: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
cd60: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
cd70: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
cd80: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
cd90: 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
cda0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
cdb0: 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
cdc0: 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
cdd0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
cde0: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
cdf0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
ce00: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
ce10: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
ce20: 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
ce30: 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 6c  base file and cl
ce40: 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
ce50: 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65 61  ate. If this mea
ce60: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72 65  ns that.** there
ce70: 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   is a hot-journa
ce80: 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  l left in the fi
ce90: 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e  le-system, the n
cea0: 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ext connection.*
ceb0: 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  * to obtain a sh
cec0: 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
ced0: 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
cee0: 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 77  y be this one) w
cef0: 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20 62  ill.** roll it b
cf00: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
cf10: 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20  e pager has not 
cf20: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
cf30: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
cf40: 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a   but an IO or.**
cf50: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63   malloc error oc
cf60: 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f  curs during a ro
cf70: 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69  llback, then thi
cf80: 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61  s will itself ca
cf90: 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65  use .** the page
cfa0: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
cfb0: 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69 63  rror state. Whic
cfc0: 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  h will be cleare
cfd0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  d by the.** call
cfe0: 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
cff0: 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64  (), as described
d000: 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69   above..*/.stati
d010: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
d020: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
d030: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d040: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
d050: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  ode==SQLITE_OK &
d060: 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
d070: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
d080: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
d090: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
d0a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
d0b0: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
d0c0: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
d0d0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
d0e0: 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75  );.  }.  pager_u
d0f0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
d100: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d110: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
d120: 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73  saction. A trans
d130: 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c  action is usuall
d140: 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65  y ended by .** e
d150: 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f  ither a COMMIT o
d160: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65  r a ROLLBACK ope
d170: 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75  ration. This rou
d180: 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c 6c  tine may be call
d190: 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c  ed .** after rol
d1a0: 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a  lback of a hot-j
d1b0: 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e  ournal, or if an
d1c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
d1d0: 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74  ile opening.** t
d1e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d1f0: 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 76  or writing the v
d200: 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  ery first journa
d210: 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a  l-header of a.**
d220: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
d230: 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  ction..** .** If
d240: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
d250: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f 72   PAGER_SHARED or
d260: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
d270: 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
d280: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d290: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
d2a0: 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49 54  p (returns SQLIT
d2b0: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  E_OK)..**.** Oth
d2c0: 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
d2d0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
d2e0: 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
d2f0: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
d300: 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
d310: 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
d320: 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
d330: 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
d340: 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
d350: 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
d360: 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
d370: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
d380: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
d390: 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
d3a0: 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
d3b0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
d3c0: 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
d3d0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
d3e0: 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
d3f0: 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
d400: 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
d410: 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
d420: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
d430: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
d440: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
d450: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
d460: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
d470: 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
d480: 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
d490: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
d4a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
d4b0: 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
d4c0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
d4d0: 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
d4e0: 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
d4f0: 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
d500: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
d510: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
d520: 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
d530: 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
d540: 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
d550: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
d560: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
d570: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
d580: 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
d590: 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
d5a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d5b0: 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
d5c0: 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
d5d0: 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
d5e0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
d5f0: 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
d600: 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
d610: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
d620: 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
d630: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
d640: 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
d650: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
d660: 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
d670: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
d680: 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
d690: 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
d6a0: 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
d6b0: 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
d6c0: 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
d6d0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
d6e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
d6f0: 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
d700: 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
d710: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
d720: 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
d730: 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
d740: 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
d750: 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
d760: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
d770: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
d780: 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
d790: 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
d7a0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
d7b0: 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
d7c0: 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
d7d0: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
d7e0: 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66 20  s finalized, if 
d7f0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
d800: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
d810: 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76 65  he.** pager move
d820: 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  s to PAGER_SHARE
d830: 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f 77  D state (and dow
d840: 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63 6b  ngrades the lock
d850: 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
d860: 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64 69  ase file accordi
d870: 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ngly)..**.** If 
d880: 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
d890: 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
d8a0: 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69 6e  e mode and is in
d8b0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74   PAGER_SYNCED st
d8c0: 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65 73  ate,.** it moves
d8d0: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
d8e0: 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72  IVE. No locks ar
d8f0: 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68 65  e downgraded whe
d900: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20  n running in.** 
d910: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
d920: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
d930: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
d940: 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
d950: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d960: 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
d970: 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
d980: 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
d990: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d9a0: 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
d9b0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
d9c0: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
d9d0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
d9e0: 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
d9f0: 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
da00: 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
da10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
da20: 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
da30: 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
da40: 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
da50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
da60: 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
da70: 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
da80: 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
da90: 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
daa0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
dab0: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
dac0: 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
dad0: 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
dae0: 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
daf0: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
db00: 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
db10: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
db20: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
db30: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
db40: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
db50: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
db60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
db70: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
db80: 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
db90: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
dba0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
dbb0: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
dbc0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
dbd0: 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
dbe0: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
dbf0: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  */..  if( pPager
dc00: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
dc10: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
dc20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dc30: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c    }.  releaseAll
dc40: 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
dc50: 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  r);..  assert( i
dc60: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
dc70: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
dc80: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
dc90: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
dca0: 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
dcb0: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
dcc0: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
dcd0: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
dce0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
dcf0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
dd00: 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
dd10: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  l(pPager->jfd) )
dd20: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
dd30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
dd40: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
dd50: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
dd60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
dd70: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
dd80: 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
dd90: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
dda0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
ddb0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
ddc0: 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
ddd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
dde0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
ddf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
de00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
de10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
de20: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
de30: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
de40: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
de50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
de60: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
de70: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
de80: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
de90: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
dea0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
deb0: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
dec0: 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
ded0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
dee0: 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
def0: 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
df00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
df10: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
df20: 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
df30: 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
df40: 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ter);.      page
df50: 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
df60: 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  rc);.      pPage
df70: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
df80: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
df90: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
dfa0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
dfb0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
dfc0: 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
dfd0: 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
dfe0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
dff0: 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
e000: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
e010: 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
e020: 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
e030: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
e040: 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
e050: 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
e060: 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
e070: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
e080: 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
e090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e0a0: 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
e0b0: 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
e0c0: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  ry journal. .   
e0d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
e0e0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
e0f0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
e100: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
e110: 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
e120: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e130: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
e140: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
e150: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
e160: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
e170: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
e180: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
e190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e1a0: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
e1b0: 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
e1c0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
e1d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
e1e0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
e1f0: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
e200: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e210: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
e220: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
e230: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
e240: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
e250: 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
e260: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
e270: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
e280: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
e290: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
e2a0: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
e2b0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
e2c0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
e2d0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
e2e0: 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ec = 0;.  sqlite
e2f0: 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
e300: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
e310: 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
e320: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
e330: 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
e340: 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e  3WalEndWriteTran
e350: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
e360: 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  pWal);.    asser
e370: 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  t( rc2==SQLITE_O
e380: 4b 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  K );.    pPager-
e390: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
e3a0: 48 41 52 45 44 3b 0a 0a 20 20 20 20 2f 2a 20 49  HARED;..    /* I
e3b0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
e3c0: 20 77 61 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   was in locking_
e3d0: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
e3e0: 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f  ode but is no lo
e3f0: 6e 67 65 72 2c 0a 20 20 20 20 2a 2a 20 64 72 6f  nger,.    ** dro
e400: 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
e410: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
e420: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
e430: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
e440: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
e450: 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
e460: 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
e470: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30  (pPager->pWal, 0
e480: 29 20 29 7b 0a 20 20 20 20 20 20 72 63 32 20 3d  ) ){.      rc2 =
e490: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
e4a0: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
e4b0: 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  K);.    }.  }els
e4c0: 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
e4d0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
e4e0: 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f      rc2 = osUnlo
e4f0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
e500: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
e510: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
e520: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
e530: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
e540: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
e550: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
e560: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
e570: 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70  _SYNCED ){.    p
e580: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
e590: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
e5a0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
e5b0: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
e5c0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
e5d0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
e5e0: 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a  bModified = 0;..
e5f0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68    /* TODO: Is th
e600: 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20  is optimal? Why 
e610: 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20 69  is the db size i
e620: 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65 20  nvalidated here 
e630: 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64  .  ** when the d
e640: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
e650: 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f  not unlocked? */
e660: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  .  pPager->dbOri
e670: 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c  gSize = 0;.  sql
e680: 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61  ite3PcacheTrunca
e690: 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  te(pPager->pPCac
e6a0: 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  he, pPager->dbSi
e6b0: 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  ze);.  if( !MEMD
e6c0: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
e6d0: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
e6e0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
e6f0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
e700: 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
e710: 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
e720: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
e730: 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
e740: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
e750: 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
e760: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
e770: 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
e780: 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
e790: 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
e7a0: 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
e7b0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
e7c0: 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
e7d0: 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
e7e0: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
e7f0: 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
e800: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
e810: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
e820: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
e830: 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
e840: 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
e850: 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
e860: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
e870: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
e880: 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
e890: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
e8a0: 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
e8b0: 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
e8c0: 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
e8d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
e8e0: 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
e8f0: 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
e900: 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
e910: 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
e920: 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
e930: 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
e940: 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
e950: 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
e960: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
e970: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
e980: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
e990: 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
e9a0: 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
e9b0: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
e9c0: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
e9d0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
e9e0: 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
e9f0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
ea00: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
ea10: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
ea20: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
ea30: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
ea40: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
ea50: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
ea60: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
ea70: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
ea80: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
ea90: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
eaa0: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
eab0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
eac0: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
ead0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
eae0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
eaf0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
eb00: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
eb10: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
eb20: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
eb30: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
eb40: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
eb50: 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
eb60: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
eb70: 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
eb80: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
eb90: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
eba0: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
ebb0: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
ebc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
ebd0: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
ebe0: 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  either the journ
ebf0: 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61  al file (if isMa
ec00: 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a  inJrnl==1) or.**
ec10: 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
ec20: 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e  urnal (if isMain
ec30: 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61  Jrnl==0) and pla
ec40: 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e  yback that page.
ec50: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67  .** The page beg
ec60: 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70  ins at offset *p
ec70: 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
ec80: 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73  file. The *pOffs
ec90: 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69  et.** value is i
eca0: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
ecb0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
ecc0: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  t page in the jo
ecd0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
ece0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67   isMainJrnl flag
ecf0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73   is true if this
ed00: 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   is the main rol
ed10: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
ed20: 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74  d.** false for t
ed30: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ed40: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20  rnal.  The main 
ed50: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
ed60: 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75   uses.** checksu
ed70: 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
ed80: 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
ed90: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
eda0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
edb0: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
edc0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
edd0: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
ede0: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
edf0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
ee00: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
ee10: 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
ee20: 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
ee30: 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
ee40: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
ee50: 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
ee60: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
ee70: 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
ee80: 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
ee90: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
eea0: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
eeb0: 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
eec0: 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
eed0: 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
eee0: 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
eef0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
ef00: 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
ef10: 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
ef20: 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
ef30: 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
ef40: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
ef50: 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
ef60: 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
ef70: 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
ef80: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
ef90: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
efa0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
efb0: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
efc0: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
efd0: 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
efe0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
eff0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
f000: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
f010: 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
f020: 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
f030: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
f040: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
f050: 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
f060: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
f070: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
f080: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
f090: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
f0a0: 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
f0b0: 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
f0c0: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
f0d0: 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
f0e0: 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
f0f0: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
f100: 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
f110: 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
f120: 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
f130: 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
f140: 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
f150: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
f160: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
f170: 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
f180: 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
f190: 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
f1a0: 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
f1b0: 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
f1c0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
f1d0: 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
f1e0: 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
f1f0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
f200: 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
f210: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
f220: 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
f230: 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
f240: 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
f250: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
f260: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
f270: 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
f280: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
f290: 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
f2a0: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
f2b0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
f2c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
f2d0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
f2e0: 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
f2f0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
f300: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
f310: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
f320: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
f330: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
f340: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
f350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f360: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
f370: 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
f380: 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
f390: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
f3a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
f3b0: 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
f3c0: 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
f3d0: 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
f3e0: 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
f3f0: 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
f400: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
f410: 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
f420: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f430: 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
f440: 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
f450: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
f460: 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
f470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
f480: 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
f490: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
f4a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
f4b0: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f4d0: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
f4e0: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
f4f0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
f520: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
f530: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
f540: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
f550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
f560: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
f570: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
f580: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
f590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f5a0: 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
f5b0: 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
f5c0: 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
f5d0: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
f5e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
f5f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
f600: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
f610: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
f620: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
f630: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
f640: 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
f650: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61  s synced */..  a
f660: 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
f670: 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
f680: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
f690: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
f6a0: 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
f6b0: 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
f6c0: 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
f6d0: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
f6e0: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
f6f0: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
f700: 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
f710: 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
f720: 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
f730: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
f740: 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
f750: 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
f760: 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
f770: 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
f780: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
f790: 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
f7a0: 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
f7b0: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
f7c0: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
f7d0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
f7e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  */.  assert( pag
f7f0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
f800: 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a  ==0 || (!isMainJ
f810: 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74  rnl && isSavepnt
f820: 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ) );..  /* Read 
f830: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
f840: 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
f850: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
f860: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
f870: 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
f880: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
f890: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
f8a0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f8b0: 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
f8c0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
f8d0: 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
f8e0: 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
f8f0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
f900: 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
f910: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f920: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
f930: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
f940: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38  3OsRead(jfd, (u8
f950: 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
f960: 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
f970: 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
f980: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
f990: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
f9a0: 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
f9b0: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
f9c0: 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
f9d0: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
f9e0: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
f9f0: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
fa00: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
fa10: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
fa20: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
fa30: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
fa40: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
fa50: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
fa60: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
fa70: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
fa80: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
fa90: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
faa0: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
fab0: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
fac0: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
fad0: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
fae0: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
faf0: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
fb00: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
fb10: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
fb20: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
fb30: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
fb40: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
fb50: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
fb60: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
fb70: 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
fb80: 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
fb90: 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
fba0: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
fbb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fbc0: 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
fbd0: 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
fbe0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
fbf0: 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
fc00: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
fc10: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
fc20: 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
fc30: 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
fc40: 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61  m(pPager, (u8*)a
fc50: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
fc60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fc70: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
fc80: 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65    }..  if( pDone
fc90: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
fca0: 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
fcb0: 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
fcc0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
fcd0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
fce0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
fcf0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
fd00: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
fd10: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
fd20: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
fd30: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
fd40: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
fd50: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
fd60: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
fd70: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
fd80: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
fd90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
fda0: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
fdb0: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
fdc0: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
fdd0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
fde0: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
fdf0: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
fe00: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
fe10: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
fe20: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
fe30: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
fe40: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
fe50: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
fe60: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
fe70: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
fe80: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
fe90: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
fea0: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
feb0: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
fec0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
fed0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
fee0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
fef0: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
ff00: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
ff10: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
ff20: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
ff30: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
ff40: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
ff50: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
ff60: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
ff70: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
ff80: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
ff90: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
ffa0: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
ffb0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
ffc0: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
ffd0: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
ffe0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
fff0: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
10000 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
10010 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
10020 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
10030 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
10040 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
10050 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
10060 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
10070 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
10080 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10090 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
100a0 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
100b0 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
100c0 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
100d0 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
100e0 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
100f0 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
10100 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
10110 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
10120 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
10130 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
10140 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
10150 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
10160 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
10170 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
10180 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
10190 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
101a0 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
101b0 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
101c0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
101d0 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
101e0 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
101f0 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
10200 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
10210 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
10220 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
10230 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
10240 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
10250 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
10260 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
10270 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
10280 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
10290 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
102a0 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
102b0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
102c0 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
102d0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
102e0 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
102f0 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
10300 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
10310 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
10320 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
10330 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
10340 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
10350 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
10360 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
10370 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
10380 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
10390 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
103a0 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
103b0 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
103c0 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
103d0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
103e0 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
103f0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
10400 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
10410 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
10420 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
10430 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
10440 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
10450 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
10460 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
10470 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
10480 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  /.  if( pagerUse
10490 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
104a0 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
104b0 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  lse{.    pPg = p
104c0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
104d0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  er, pgno);.  }. 
104e0 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
104f0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45  !MEMDB );.  PAGE
10500 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43  RTRACE(("PLAYBAC
10510 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
10520 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
10530 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
10540 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
10550 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
10560 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10570 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20  , (u8*)aData),. 
10580 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
10590 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
105a0 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
105b0 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  l").  ));.  if( 
105c0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
105d0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61    isSynced = pPa
105e0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28  ger->noSync || (
105f0 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67  *pOffset <= pPag
10600 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
10610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
10620 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30  Synced = (pPg==0
10630 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
10640 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
10650 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66  SYNC));.  }.  if
10660 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
10670 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
10680 45 29 0a 20 20 20 26 26 20 69 73 4f 70 65 6e 28  E).   && isOpen(
10690 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
106a0 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a  & isSynced.  ){.
106b0 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
106c0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
106d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
106e0 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73     testcase( !is
106f0 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d  Savepnt && pPg!=
10700 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  0 && (pPg->flags
10710 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
10720 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=0 );.    asse
10730 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
10740 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
10750 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10760 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
10770 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
10780 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
10790 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
107a0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
107b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
107c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
107d0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
107e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
107f0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
10800 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
10810 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
10820 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
10830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
10840 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
10850 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
10860 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
10870 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
10880 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
10890 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
108a0 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
108b0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
108c0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
108d0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
108e0 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
108f0 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
10900 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
10910 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
10920 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
10930 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
10940 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
10950 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
10960 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
10970 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
10980 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
10990 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
109a0 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
109b0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
109c0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
109d0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
109e0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
109f0 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
10a00 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
10a10 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
10a20 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
10a30 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
10a40 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
10a50 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
10a60 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
10a70 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
10a80 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
10a90 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
10aa0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
10ab0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
10ac0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
10ad0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
10ae0 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
10af0 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
10b00 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
10b10 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
10b20 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
10b30 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
10b40 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
10b50 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
10b60 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
10b70 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
10b80 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
10b90 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
10ba0 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
10bb0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
10bc0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
10bd0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
10be0 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
10bf0 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
10c00 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
10c10 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
10c20 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
10c30 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
10c40 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
10c50 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
10c60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10c70 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29 3b  doNotSpill==0 );
10c80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
10c90 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72  otSpill++;.    r
10ca0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10cb0 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
10cc0 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a  pgno, &pPg, 1);.
10cd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10ce0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d  er->doNotSpill==
10cf0 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
10d00 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20  >doNotSpill--;. 
10d10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10d20 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
10d30 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  ;.    pPg->flags
10d40 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
10d50 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
10d60 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
10d70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
10d80 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
10d90 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
10da0 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
10db0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
10dc0 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
10dd0 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
10de0 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
10df0 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
10e00 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
10e10 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
10e20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
10e30 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
10e40 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
10e50 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
10e60 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
10e70 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
10e80 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
10e90 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
10ea0 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
10eb0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
10ec0 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
10ed0 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
10ee0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
10ef0 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
10f00 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61  Data, (u8*)aData
10f10 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
10f20 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ze);.    pPager-
10f30 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
10f40 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
10f50 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
10f60 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
10f70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
10f80 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
10f90 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
10fa0 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
10fb0 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
10fc0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
10fd0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
10fe0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
10ff0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
11000 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
11010 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
11020 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
11030 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
11040 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
11050 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
11060 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
11070 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
11080 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
11090 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
110a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
110b0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2a  tabase..      **
110c0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
110d0 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e  is one exception
110e0 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49   to this rule. I
110f0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  f the page is be
11100 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20  ing rolled.     
11110 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74   ** back as part
11120 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
11130 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72  (or statement) r
11140 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20  ollback from an 
11150 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63  .      ** unsync
11160 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
11170 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
11180 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
11190 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a  not safe.      *
111a0 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61  * to mark the pa
111b0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69  ge as clean. Thi
111c0 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72  s is because mar
111d0 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73  king the page as
111e0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20  .      ** clean 
111f0 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50  will clear the P
11200 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
11210 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70  lag. Since the p
11220 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  age is.      ** 
11230 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
11240 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63  ournal file (rec
11250 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70  orded in Pager.p
11260 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20  InJournal) and. 
11270 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
11280 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
11290 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20   is cleared, if 
112a0 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
112b0 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ten to.      ** 
112c0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
112d0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  s transaction, i
112e0 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64  t will be marked
112f0 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20   as dirty but.  
11300 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
11310 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
11320 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e  will not be set.
11330 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70   It could then p
11340 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20  otentially.     
11350 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f   ** be written o
11360 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ut into the data
11370 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
11380 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
11390 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
113a0 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66  nt is synced. If
113b0 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
113c0 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77  during or follow
113d0 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20  ing this,.      
113e0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  ** database corr
113f0 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65  uption may ensue
11400 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11410 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
11420 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
11430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
11440 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
11450 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  g);.    }.#ifdef
11460 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
11470 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
11480 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
11490 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
114a0 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  dif.    /* If th
114b0 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
114c0 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
114d0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
114e0 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
114f0 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
11500 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
11510 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
11520 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
11530 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
11540 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
11550 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
11560 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
11570 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
11580 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
11590 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
115a0 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
115b0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
115c0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
115d0 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
115e0 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
115f0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
11600 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
11610 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
11620 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
11630 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
11640 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11650 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
11660 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
11670 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
11680 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11690 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
116a0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
116b0 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
116c0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
116d0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
116e0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
116f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
11700 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
11710 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
11720 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
11730 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
11740 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
11750 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
11760 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
11770 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
11780 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
11790 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
117a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
117b0 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
117c0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
117d0 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
117e0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
117f0 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
11800 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
11810 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
11820 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
11830 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
11840 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
11850 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
11860 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
11870 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
11880 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
11890 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
118a0 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
118b0 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
118c0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
118d0 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
118e0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
118f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
11900 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
11910 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
11920 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
11930 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
11940 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
11950 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
11960 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
11970 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
11980 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
11990 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
119a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
119b0 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
119c0 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
119d0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
119e0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
119f0 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
11a00 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
11a10 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
11a20 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
11a30 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
11a40 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
11a50 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
11a60 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
11a70 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
11a80 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
11a90 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
11aa0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
11ab0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
11ac0 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
11ad0 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
11ae0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
11af0 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
11b00 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
11b10 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
11b20 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
11b30 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
11b40 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
11b50 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
11b60 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
11b70 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
11b80 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
11b90 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
11ba0 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
11bb0 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
11bc0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
11bd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
11be0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
11bf0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
11c00 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
11c10 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
11c20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
11c30 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
11c40 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
11c50 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
11c60 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
11c70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
11c80 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
11c90 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
11ca0 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
11cb0 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
11cc0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11cd0 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
11ce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
11cf0 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
11d00 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
11d10 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
11d20 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
11d30 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11d40 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
11d50 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
11d60 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
11d70 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
11d80 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
11d90 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
11da0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
11db0 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
11dc0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
11dd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
11de0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
11df0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
11e00 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
11e10 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11e20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
11e30 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
11e40 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
11e50 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
11e60 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
11e70 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11e80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
11e90 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
11ea0 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
11eb0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
11ec0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
11ed0 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
11ee0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
11ef0 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
11f00 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
11f10 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
11f20 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
11f30 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
11f40 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
11f50 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
11f60 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
11f70 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
11f80 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
11f90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
11fa0 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
11fb0 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
11fc0 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
11fd0 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
11fe0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
11ff0 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
12000 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
12010 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
12020 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
12030 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
12040 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
12050 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
12060 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
12070 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
12080 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
12090 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
120a0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
120b0 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
120c0 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
120d0 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
120e0 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
120f0 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
12100 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
12110 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
12120 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
12130 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
12140 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
12150 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12160 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
12170 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
12180 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
12190 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
121a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
121b0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
121c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
121d0 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
121e0 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
121f0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
12200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
12210 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
12220 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
12230 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
12240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
12250 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
12260 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
12270 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
12280 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
12290 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
122a0 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
122b0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
122c0 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
122d0 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
122e0 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
122f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
12300 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
12310 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
12320 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
12330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12340 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
12350 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
12360 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
12370 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
12380 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
12390 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
123a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
123b0 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
123c0 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
123d0 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
123e0 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
123f0 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
12400 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
12410 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12420 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
12430 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
12440 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
12450 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
12460 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
12470 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
12480 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
12490 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
124a0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
124b0 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
124c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
124d0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
124e0 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
124f0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
12500 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
12510 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
12520 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
12530 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
12540 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
12550 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
12560 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
12570 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12580 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
12590 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
125a0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
125b0 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
125c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
125d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
125e0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
125f0 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
12600 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
12610 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12620 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
12630 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12640 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
12650 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
12660 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
12670 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
12680 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
12690 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
126a0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
126b0 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
126c0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
126d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
126e0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
126f0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
12700 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
12710 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
12720 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
12730 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
12740 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
12750 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
12760 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12780 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12790 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
127a0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
127b0 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
127c0 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
127d0 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
127e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
127f0 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
12800 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12820 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
12830 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
12840 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
12850 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
12860 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
12870 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
12880 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
12890 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
128a0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
128b0 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
128c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
128d0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
128e0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
128f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12900 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
12910 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12920 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
12930 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
12940 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
12950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
12960 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
12970 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
12980 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
12990 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
129a0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
129b0 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
129c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
129d0 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
129e0 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
129f0 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
12a00 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
12a10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12a20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
12a30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
12a40 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
12a50 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
12a60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
12a70 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
12a80 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
12a90 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
12aa0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
12ab0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
12ac0 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
12ad0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
12ae0 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
12af0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
12b00 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
12b10 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
12b20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
12b30 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  , or an exclusiv
12b40 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a 2a  e lock is not.**
12b50 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
12b60 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
12b70 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
12b80 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
12b90 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20 74   is.** changed t
12ba0 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
12bb0 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
12bc0 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49 66  eSize bytes). If
12bd0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e 20   the file.** on 
12be0 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  disk is currentl
12bf0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50  y larger than nP
12c00 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20  age pages, then 
12c10 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78  use the VFS.** x
12c20 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f  Truncate() metho
12c30 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74  d to truncate it
12c40 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d  ..**.** Or, it m
12c50 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68  ight might be th
12c60 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
12c70 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
12c80 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a  smaller than .**
12c90 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f   nPage pages. So
12ca0 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  me operating sys
12cb0 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
12cc0 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
12cd0 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20  used if .** you 
12ce0 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20  try to truncate 
12cf0 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73  a file to some s
12d00 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67  ize that is larg
12d10 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63  er than it .** c
12d20 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20  urrently is, so 
12d30 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
12d40 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
12d50 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
12d60 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20   .** the end of 
12d70 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73  the new file ins
12d80 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  tead..**.** If s
12d90 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
12da0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
12db0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
12dc0 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69  rs while modifyi
12dd0 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  ng.** the databa
12de0 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20  se file, return 
12df0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
12e00 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
12e10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12e20 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12e30 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12e40 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
12e50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12e60 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
12e70 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
12e80 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  E && isOpen(pPag
12e90 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 69  er->fd) ){.    i
12ea0 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
12eb0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a 20  newSize;.    /* 
12ec0 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
12ed0 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
12ee0 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
12ef0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
12f00 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
12f10 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
12f20 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
12f30 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
12f40 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
12f50 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
12f60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
12f70 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
12f80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
12f90 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
12fa0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
12fb0 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
12fc0 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
12fd0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
12fe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
12ff0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
13000 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
13010 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
13020 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13040 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
13050 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
13060 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
13070 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13080 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13090 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
130a0 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
130b0 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
130c0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
130d0 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
130e0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
130f0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
13100 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
13110 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
13120 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
13130 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
13140 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
13150 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
13160 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
13170 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
13180 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
13190 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
131a0 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
131b0 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
131c0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
131d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
131e0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
131f0 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
13200 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
13210 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
13220 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
13230 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
13240 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
13250 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
13260 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
13270 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
13280 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
13290 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
132a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
132b0 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
132c0 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
132d0 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
132e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
132f0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
13300 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
13310 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
13320 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
13330 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13340 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
13350 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
13360 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
13370 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
13380 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
13390 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
133a0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
133b0 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
133c0 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
133d0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
133e0 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
133f0 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
13400 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
13410 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
13420 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
13430 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13440 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
13450 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
13460 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
13470 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
13480 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <32 ){.    pPage
13490 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
134a0 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
134b0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
134c0 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
134d0 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
134e0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
134f0 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
13500 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
13510 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
13520 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
13530 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
13540 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
13550 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
13560 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
13570 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
13580 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
13590 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
135a0 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
135b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
135c0 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
135d0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
135e0 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
135f0 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
13600 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
13610 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
13620 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
13630 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
13640 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
13650 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
13660 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
13670 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
13680 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
13690 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
136a0 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
136b0 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
136c0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
136d0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
136e0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
136f0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
13700 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
13710 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
13720 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
13730 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
13740 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
13750 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
13760 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
13770 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
13780 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
13790 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
137a0 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
137b0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
137c0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
137d0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
137e0 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
137f0 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
13800 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
13810 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
13820 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
13830 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
13840 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
13850 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
13860 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
13870 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
13880 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
13890 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
138a0 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
138b0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
138c0 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
138d0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
138e0 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
138f0 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
13900 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
13910 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
13920 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
13930 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
13940 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
13950 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
13960 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
13970 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
13980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13990 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
139a0 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
139b0 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
139c0 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
139d0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
139e0 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
139f0 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
13a00 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
13a10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
13a20 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
13a30 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
13a40 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
13a50 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
13a60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13a70 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
13a80 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
13a90 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
13aa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
13ab0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
13ac0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
13ad0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
13ae0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
13af0 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
13b00 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
13b10 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
13b20 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
13b30 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
13b40 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
13b50 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
13b60 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
13b70 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
13b80 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
13b90 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
13ba0 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
13bb0 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
13bc0 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
13bd0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
13be0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
13bf0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
13c00 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
13c10 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
13c20 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
13c30 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
13c40 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
13c50 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
13c60 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
13c70 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
13c80 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
13c90 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
13ca0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
13cb0 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
13cc0 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
13cd0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
13ce0 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
13cf0 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
13d00 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
13d10 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
13d20 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
13d30 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
13d40 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
13d50 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
13d60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13d70 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
13d80 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
13d90 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
13da0 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
13db0 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
13dc0 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
13dd0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
13de0 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
13df0 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
13e00 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
13e10 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
13e20 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
13e30 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
13e40 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
13e50 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
13e60 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
13e70 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
13e80 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
13e90 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
13ea0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
13eb0 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
13ec0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
13ed0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
13ee0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
13ef0 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
13f00 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
13f10 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
13f20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
13f30 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
13f40 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
13f50 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
13f60 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
13f70 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
13f80 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
13f90 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13fa0 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
13fb0 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
13fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
13fd0 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
13fe0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
13ff0 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
14000 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
14010 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
14020 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
14030 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
14040 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
14050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14060 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
14070 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
14080 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
14090 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
140a0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
140b0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
140c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
140d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
140e0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
140f0 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
14100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14110 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
14120 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
14130 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14150 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
14160 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
14170 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
14180 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
14190 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
141a0 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
141b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
141c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
141d0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
141e0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
141f0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
14200 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
14210 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
14220 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
14230 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
14240 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
14250 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
14260 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
14270 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
14280 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
14290 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
142a0 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
142b0 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
142c0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
142d0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
142e0 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
142f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
14300 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
14310 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
14320 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
14330 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
14340 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
14350 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
14360 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
14370 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
14380 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
14390 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
143a0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
143b0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
143c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
143d0 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
143e0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
143f0 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
14400 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
14410 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
14420 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
14430 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
14440 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
14450 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
14460 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
14470 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
14480 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
14490 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
144a0 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
144b0 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
144c0 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
144d0 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
144e0 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
144f0 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
14500 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
14510 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
14520 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
14530 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
14540 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
14550 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
14560 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
14570 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
14580 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
14590 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
145a0 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
145b0 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
145c0 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
145d0 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
145e0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
145f0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
14600 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
14610 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
14620 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
14630 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
14640 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
14650 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
14660 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
14670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
14680 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
14690 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
146a0 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
146b0 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
146c0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
146d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
146e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
146f0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
14700 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14710 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
14720 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
14730 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
14740 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
14750 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
14760 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
14770 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
14780 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
14790 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
147a0 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
147b0 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
147c0 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
147d0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a  ile( 1 ){.    /*
147e0 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
147f0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
14800 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
14810 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
14820 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
14830 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
14840 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
14850 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
14860 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
14870 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
14880 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
14890 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
148a0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
148b0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
148c0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
148d0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
148e0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
148f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
14900 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
14910 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
14920 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
14930 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
14940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
14950 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14960 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
14970 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14980 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
14990 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
149a0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
149b0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
149c0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
149d0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
149e0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
149f0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
14a00 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
14a10 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
14a20 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
14a30 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
14a40 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
14a50 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
14a60 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
14a70 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
14a80 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
14a90 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
14aa0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
14ab0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
14ac0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
14ad0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
14ae0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14af0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
14b00 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
14b10 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
14b20 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
14b30 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
14b40 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
14b50 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
14b60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14b70 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
14b80 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
14b90 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
14ba0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
14bb0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
14bc0 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
14bd0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
14be0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
14bf0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
14c00 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
14c10 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
14c20 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
14c30 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
14c40 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
14c50 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
14c60 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
14c70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
14c80 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
14c90 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
14ca0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
14cb0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
14cc0 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
14cd0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
14ce0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
14cf0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
14d00 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
14d10 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
14d20 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
14d30 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
14d40 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
14d50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
14d60 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
14d70 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
14d80 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
14d90 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
14da0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
14db0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
14dc0 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
14dd0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
14de0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
14df0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
14e00 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
14e10 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
14e20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
14e30 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
14e40 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
14e50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
14e60 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
14e70 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
14e80 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
14e90 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
14ea0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
14eb0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
14ec0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14ed0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
14ee0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
14ef0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
14f00 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
14f10 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
14f20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14f30 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
14f40 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
14f50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
14f60 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
14f70 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
14f80 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
14f90 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
14fa0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
14fb0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
14fc0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
14fd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
14fe0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14ff0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
15000 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
15010 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
15020 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
15030 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15050 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
15060 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
15070 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
15080 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
15090 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
150a0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
150b0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
150c0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
150d0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
150e0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
150f0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
15100 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
15110 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
15120 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
15130 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
15140 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
15150 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
15160 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
15170 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
15180 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
15190 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
151a0 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
151b0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
151c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
151d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
151e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
151f0 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
15200 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15210 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
15220 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15230 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
15240 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15250 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
15260 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
15270 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
15280 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
15290 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
152a0 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
152b0 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
152c0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
152d0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
152e0 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
152f0 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
15300 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
15310 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
15320 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
15330 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
15340 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
15350 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
15360 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
15370 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
15380 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
15390 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
153a0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
153b0 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
153c0 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
153d0 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
153e0 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
153f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15400 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
15410 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
15420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15430 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
15440 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
15450 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
15460 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
15470 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
15480 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
15490 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
154a0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
154b0 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
154c0 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
154d0 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
154e0 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
154f0 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
15500 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
15510 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
15520 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
15530 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
15540 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
15550 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
15560 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
15570 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15580 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15590 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
155a0 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
155b0 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
155c0 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
155d0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
155e0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
155f0 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
15600 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
15610 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
15620 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
15630 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
15640 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
15650 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
15660 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
15670 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
15680 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
15690 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
156a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
156b0 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
156c0 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ied..  */.  asse
156d0 72 74 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rt(.    pPager->
156e0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20  fd->pMethods==0 
156f0 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ||.    sqlite3Os
15700 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
15710 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43  er->fd,SQLITE_FC
15720 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
15730 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ,0)>=SQLITE_OK. 
15740 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
15750 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
15760 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
15770 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
15780 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
15790 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
157a0 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
157b0 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
157c0 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
157d0 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
157e0 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
157f0 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
15800 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
15810 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
15820 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
15830 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
15840 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
15850 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
15860 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
15870 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
15880 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
15890 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
158a0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
158b0 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
158c0 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
158d0 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
158e0 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
158f0 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
15900 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
15910 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
15920 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
15930 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
15940 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
15950 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
15960 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
15970 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
15980 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
15990 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
159a0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
159b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
159c0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
159d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
159e0 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
159f0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
15a00 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
15a10 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
15a20 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
15a30 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
15a40 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
15a50 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
15a60 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
15a70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15a80 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  && pPager->noSyn
15a90 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
15aa0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
15ab0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63  LUSIVE ){.    rc
15ac0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
15ad0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
15ae0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
15af0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
15b00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
15b10 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
15b20 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
15b30 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
15b40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15b50 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
15b60 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
15b70 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
15b80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15b90 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
15ba0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
15bb0 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
15bc0 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
15bd0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
15be0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
15bf0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
15c00 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
15c10 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
15c20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
15c30 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
15c40 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
15c50 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
15c60 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
15c70 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
15c80 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
15c90 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
15ca0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
15cb0 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
15cc0 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
15cd0 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
15ce0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
15cf0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
15d00 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
15d10 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
15d20 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
15d30 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
15d40 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
15d50 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
15d60 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
15d70 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
15d80 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
15d90 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
15da0 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
15db0 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
15dc0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
15dd0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
15de0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15df0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
15e00 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
15e10 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
15e20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15e30 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
15e40 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
15e50 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
15e60 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
15e70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
15e80 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
15e90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15ea0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
15eb0 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
15ec0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
15ed0 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
15ee0 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
15ef0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
15f00 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
15f10 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
15f20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
15f30 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
15f40 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
15f50 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
15f60 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
15f70 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
15f80 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
15f90 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
15fa0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
15fb0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
15fc0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
15fd0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
15fe0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
15ff0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
16000 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
16010 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
16020 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
16030 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
16040 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
16050 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16060 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 57 61   */.  int isInWa
16070 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
16080 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 61     /* True if pa
16090 67 65 20 69 73 20 69 6e 20 6c 6f 67 20 66 69 6c  ge is in log fil
160a0 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
160b0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
160c0 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
160d0 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
160e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
160f0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
16100 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d  R_SHARED && !MEM
16110 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
16120 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
16130 64 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  d) );..  if( NEV
16140 45 52 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65  ER(!isOpen(pPage
16150 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 61  r->fd)) ){.    a
16160 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
16170 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d  empFile );.    m
16180 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
16190 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
161a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 65 74 75  eSize);.    retu
161b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
161c0 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
161d0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
161e0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
161f0 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
16200 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
16210 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
16220 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
16230 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
16240 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70  gno, &isInWal, p
16250 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  gsz, pPg->pData)
16260 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
16270 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73  SQLITE_OK && !is
16280 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20 69 36 34  InWal ){.    i64
16290 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
162a0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
162b0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
162c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
162d0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
162e0 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20  g->pData, pgsz, 
162f0 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66  iOffset);.    if
16300 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
16310 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
16320 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16330 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
16340 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ..  if( pgno==1 
16350 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  ){.    if( rc ){
16360 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
16370 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65   read is unsucce
16380 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64  ssful, set the d
16390 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73  bFileVers[] to s
163a0 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a  omething.      *
163b0 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65  * that will neve
163c0 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c  r be a valid fil
163d0 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69  e version.  dbFi
163e0 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f  leVers[] is a co
163f0 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62  py.      ** of b
16400 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74  ytes 24..39 of t
16410 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79  he database.  By
16420 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c  tes 28..31 shoul
16430 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20  d always be.    
16440 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65    ** zero or the
16450 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
16460 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42  abase in page. B
16470 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20  ytes 32..35 and 
16480 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20  35..39.      ** 
16490 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e  should be page n
164a0 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65  umbers which are
164b0 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66   never 0xfffffff
164c0 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20  f.  So filling. 
164d0 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e       ** pPager->
164e0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74  dbFileVers[] wit
164f0 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73  h all 0xff bytes
16500 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e   should suffice.
16510 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16520 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70  ** For an encryp
16530 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ted database, th
16540 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d  e situation is m
16550 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79  ore complex:  by
16560 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e  tes.      ** 24.
16570 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
16580 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f  ase are white no
16590 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72  ise.  But the pr
165a0 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20  obability of.   
165b0 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73     ** white nois
165c0 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ing equaling 16 
165d0 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
165e0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
165f0 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
16600 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
16610 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
16620 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
16630 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16640 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
16650 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
16660 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16670 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
16680 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
16690 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
166a0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
166b0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
166c0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
166d0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
166e0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
166f0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
16700 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
16710 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c  gno, 3, rc = SQL
16720 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50  ITE_NOMEM);..  P
16730 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
16740 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
16750 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
16760 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
16770 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
16780 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
16790 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
167a0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
167b0 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
167c0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
167e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
167f0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
16800 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
16810 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
16820 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16830 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
16840 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
16850 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
16860 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
16870 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
16880 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16890 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
168a0 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
168b0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
168c0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
168d0 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
168e0 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
168f0 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
16900 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
16910 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
16920 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
16930 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
16940 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
16950 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
16960 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
16970 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
16980 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
16990 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
169a0 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
169b0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
169c0 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
169d0 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
169e0 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
169f0 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
16a00 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
16a10 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
16a20 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
16a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16a40 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
16a50 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
16a60 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
16a70 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
16a80 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
16a90 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
16aa0 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
16ab0 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
16ac0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16ad0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
16ae0 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
16af0 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
16b00 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
16b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
16b20 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
16b30 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
16b40 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
16b50 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
16b60 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
16b70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
16b80 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
16b90 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
16ba0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
16bb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16bc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16bd0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
16be0 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
16bf0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16c00 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
16c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16c20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
16c30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16c40 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
16c50 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
16c60 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
16c70 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
16c80 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
16c90 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16ca0 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
16cb0 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
16cc0 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
16cd0 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
16ce0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
16cf0 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
16d00 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
16d10 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
16d20 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
16d30 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
16d40 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
16d50 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
16d60 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
16d70 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
16d80 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
16d90 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
16da0 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
16db0 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
16dc0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
16dd0 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
16de0 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
16df0 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
16e00 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
16e10 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
16e20 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
16e30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16e40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
16e50 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
16e60 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
16e70 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
16e80 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16e90 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
16ea0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
16eb0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ed0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
16ee0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
16f10 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
16f20 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
16f30 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
16f40 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
16f50 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
16f60 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
16f70 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
16f80 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
16f90 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
16fa0 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
16fb0 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
16fc0 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
16fd0 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
16fe0 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
16ff0 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
17000 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
17010 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
17020 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
17030 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
17040 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
17050 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
17060 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
17070 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
17080 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
17090 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
170a0 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
170b0 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
170c0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
170d0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
170e0 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
170f0 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
17100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
17110 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
17120 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
17130 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
17140 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
17150 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
17160 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
17170 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
17180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17190 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
171a0 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
171b0 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
171c0 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
171d0 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
171e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
171f0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
17200 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
17210 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
17220 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
17230 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
17240 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
17250 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
17260 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
17270 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
17280 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
17290 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
172a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172c0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
172d0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
172e0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
172f0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
17300 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
17310 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
17320 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
17330 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
17340 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
17350 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
17360 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20  isCommit,       
17370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17380 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
17390 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
173a0 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20   sync_flags     
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
173c0 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
173d0 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29   OsSync() (or 0)
173e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
17410 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
17420 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
17430 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  al );.  rc = sql
17440 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50  ite3WalFrames(pP
17450 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20  ager->pWal, .   
17460 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
17470 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75  ize, pList, nTru
17480 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c  ncate, isCommit,
17490 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b   sync_flags.  );
174a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
174b0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
174c0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50  pBackup ){.    P
174d0 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
174e0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
174f0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
17500 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
17510 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
17520 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
17530 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
17540 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17550 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17560 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
17570 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
17580 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
17590 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
175a0 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
175b0 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
175c0 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
175d0 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
175e0 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
175f0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
17600 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
17610 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
17620 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
17630 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
17640 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
17650 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
17660 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
17670 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
17680 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
17690 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
176a0 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
176b0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
176c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
176d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
176f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
17700 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
17710 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17720 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
17730 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
17740 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
17750 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
17760 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  r) );..  /* sqli
17770 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
17780 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
17790 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
177a0 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
177b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
177c0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
177d0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
177e0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
177f0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
17800 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
17810 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
17820 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
17830 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
17840 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
17850 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
17860 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
17870 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
17880 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
17890 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
178a0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
178b0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
178c0 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
178d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
178e0 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79  ){.    int dummy
178f0 3b 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67 65  ;.    if( change
17900 64 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  d ){.      pager
17910 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
17920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17930 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
17940 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
17950 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  alid==0 );.    }
17960 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17970 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17980 70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b  pPager, &dummy);
17990 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
179a0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
179b0 52 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  RED;..  return r
179c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
179d0 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
179e0 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
179f0 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
17a00 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
17a10 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 2e  Pager.** exists.
17a20 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
17a30 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
17a40 70 45 78 69 73 74 73 20 74 6f 20 31 20 69 66 20  pExists to 1 if 
17a50 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
17a60 0a 2a 2a 20 6f 72 20 30 20 6f 74 68 65 72 77 69  .** or 0 otherwi
17a70 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  se and return SQ
17a80 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
17a90 4f 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  O or OOM error o
17aa0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
17ab0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
17ac0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
17ad0 20 69 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c   int pagerHasWAL
17ae0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17af0 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
17b00 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17b30 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
17b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b50 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17b60 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  the WAL file */.
17b70 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
17b80 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
17b90 20 20 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33    zWal = sqlite3
17ba0 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c  _mprintf("%s-wal
17bb0 22 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ", pPager->zFile
17bc0 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 57  name);.  if( !zW
17bd0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
17be0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
17bf0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
17c00 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
17c10 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 7a 57 61  Pager->pVfs, zWa
17c20 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
17c30 5f 45 58 49 53 54 53 2c 20 70 45 78 69 73 74 73  _EXISTS, pExists
17c40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
17c50 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20 7d 0a 20  ree(zWal);.  }. 
17c60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17c70 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
17c80 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
17c90 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
17ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
17cb0 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
17cc0 2a 20 65 78 69 73 74 73 2e 20 49 66 20 69 74 20  * exists. If it 
17cd0 64 6f 65 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  does, open the p
17ce0 61 67 65 72 20 69 6e 20 57 41 4c 20 6d 6f 64 65  ager in WAL mode
17cf0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
17d00 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
17d10 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61  rs, make sure Pa
17d20 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
17d30 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 50 41  is not set to PA
17d40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
17d50 57 41 4c 2e 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  WAL..** If an IO
17d60 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   or OOM error oc
17d70 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
17d80 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
17d90 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
17da0 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  WAL file is open
17db0 65 64 2c 20 61 6c 73 6f 20 6f 70 65 6e 20 61 20  ed, also open a 
17dc0 73 6e 61 70 73 68 6f 74 20 28 72 65 61 64 20 74  snapshot (read t
17dd0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
17de0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
17df0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
17e00 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17e10 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
17e20 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
17e30 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
17e40 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
17e50 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
17e60 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
17e70 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 2c 20 74  ete .** a WAL, t
17e80 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
17e90 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
17ea0 64 69 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 74  dition between t
17eb0 68 65 20 78 41 63 63 65 73 73 28 29 20 0a 2a 2a  he xAccess() .**
17ec0 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
17ed0 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
17ee0 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 6f  ecuted by some o
17ef0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
17f00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
17f10 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
17f20 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
17f30 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
17f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
17f50 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
17f60 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
17f70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
17f80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
17f90 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
17fa0 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  ts */.    rc = p
17fb0 61 67 65 72 48 61 73 57 41 4c 28 70 50 61 67 65  agerHasWAL(pPage
17fc0 72 2c 20 26 69 73 57 61 6c 29 3b 0a 20 20 20 20  r, &isWal);.    
17fd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17fe0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
17ff0 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
18000 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
18010 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
18020 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
18030 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
18040 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
18050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18060 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
18070 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
18080 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
18090 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
180a0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
180b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
180c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
180d0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
180e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
180f0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
18100 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
18110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18120 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18130 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18140 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
18150 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
18160 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
18170 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
18180 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
18190 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
181a0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
181b0 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
181c0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
181d0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
181e0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
181f0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
18200 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
18210 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
18220 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
18230 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
18240 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
18250 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
18260 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
18270 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
18280 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
18290 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
182a0 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
182b0 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
182c0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
182d0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
182e0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
182f0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
18300 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
18310 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
18320 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
18330 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
18340 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
18350 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
18360 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
18370 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
18380 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
18390 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
183a0 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
183b0 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
183c0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
183d0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
183e0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
183f0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
18400 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
18410 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
18420 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
18430 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
18440 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
18450 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
18460 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
18470 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
18480 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
18490 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
184a0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
184b0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
184c0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
184d0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
184e0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
184f0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
18500 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
18510 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
18520 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
18530 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
18540 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
18550 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
18560 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
18570 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
18580 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
18590 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
185a0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
185b0 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
185c0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
185d0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
185e0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
185f0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
18600 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
18610 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
18620 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
18630 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
18640 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
18650 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
18660 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
18670 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
18680 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
18690 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
186a0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
186b0 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
186c0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
186d0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
186e0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
186f0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
18700 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
18710 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
18720 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
18730 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
18740 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
18750 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
18760 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
18770 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
18780 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
18790 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
187a0 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
187b0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
187c0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
187d0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
187e0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
187f0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
18800 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
18810 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
18820 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
18830 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
18840 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
18850 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
18860 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
18870 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
18880 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
18890 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
188a0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
188b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
188c0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
188d0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
188e0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
188f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18900 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
18910 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
18920 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
18930 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
18940 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
18950 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
18960 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
18970 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18980 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
18990 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
189a0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
189b0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
189c0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
189d0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
189e0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
189f0 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
18a00 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
18a10 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
18a20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
18a30 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
18a40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18a50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18a60 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
18a70 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
18a80 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
18a90 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
18aa0 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
18ab0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
18ac0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
18ad0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
18ae0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
18af0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
18b00 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
18b10 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
18b20 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
18b30 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
18b40 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
18b50 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
18b60 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
18b70 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
18b80 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
18b90 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
18ba0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
18bb0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
18bc0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
18bd0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
18be0 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
18bf0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
18c00 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
18c10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
18c20 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
18c30 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
18c40 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
18c50 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
18c60 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
18c70 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
18c80 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
18c90 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
18ca0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
18cb0 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
18cc0 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
18cd0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
18ce0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
18cf0 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
18d00 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
18d10 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
18d20 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
18d30 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
18d40 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
18d50 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
18d60 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
18d70 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
18d80 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
18d90 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
18da0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
18db0 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
18dc0 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
18dd0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
18de0 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
18df0 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
18e00 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
18e10 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
18e20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
18e30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
18e40 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
18e50 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18e60 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
18e70 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
18e80 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
18e90 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
18ea0 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
18eb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
18ec0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
18ed0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
18ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18ef0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18f00 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
18f10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
18f20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
18f30 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
18f40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
18f50 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
18f60 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
18f70 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
18f80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18f90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
18fa0 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
18fb0 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
18fc0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
18fd0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
18fe0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
18ff0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
19000 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
19010 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
19020 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
19030 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
19040 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
19050 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
19060 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
19070 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
19080 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
19090 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
190a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
190b0 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
190c0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
190d0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
190e0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
190f0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
19100 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
19110 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
19120 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
19130 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
19140 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
19150 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
19160 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
19170 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
19180 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
19190 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
191a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
191b0 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
191c0 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
191d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
191e0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
191f0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
19200 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
19210 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
19220 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
19230 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
19240 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
19250 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
19260 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
19270 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
19280 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
19290 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
192a0 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
192b0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
192c0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
192d0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
192e0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
192f0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
19300 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
19310 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
19320 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
19330 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
19340 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
19350 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
19360 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
19370 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
19380 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
19390 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
193a0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
193b0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
193c0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
193d0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
193e0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
193f0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
19400 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
19410 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
19420 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a  >journalOff>=szJ
19430 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
19440 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
19450 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
19460 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
19470 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
19480 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
19490 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
194a0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
194b0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
194c0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
194d0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
194e0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
194f0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
19500 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
19510 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
19520 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
19530 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19540 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
19550 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
19560 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
19570 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19580 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
19590 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
195a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
195b0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
195c0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
195d0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
195e0 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
195f0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
19600 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
19610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
19620 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
19630 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
19640 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
19650 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
19660 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
19670 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
19680 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
19690 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
196a0 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
196b0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
196c0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
196d0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
196e0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
196f0 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
19700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19710 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19720 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
19730 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19740 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19750 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
19760 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
19770 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
19780 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
19790 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
197a0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
197b0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
197c0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
197d0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
197e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
197f0 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
19800 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
19810 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
19820 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
19830 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19840 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
19850 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
19860 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
19870 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
19880 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
19890 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
198a0 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
198b0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
198c0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
198d0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
198e0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
198f0 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
19900 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
19910 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
19920 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
19930 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
19940 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
19950 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
19960 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
19970 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
19980 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
19990 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
199a0 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
199b0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
199c0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
199d0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
199e0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
199f0 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
19a00 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
19a10 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
19a20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
19a30 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
19a40 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
19a50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19a60 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
19a70 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
19a80 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
19a90 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
19aa0 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
19ab0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
19ac0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
19ad0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
19ae0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
19af0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
19b00 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
19b10 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
19b20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
19b30 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
19b40 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
19b50 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
19b60 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
19b70 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
19b80 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
19b90 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
19bb0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
19bc0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
19bd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19be0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
19bf0 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
19c00 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
19c10 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
19c20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
19c30 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
19c40 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
19c50 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
19c60 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
19c70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
19c80 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
19c90 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
19ca0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
19cb0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
19cc0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
19cd0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
19ce0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
19cf0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
19d00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19d10 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
19d20 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
19d30 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
19d40 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
19d50 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
19d60 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
19d70 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
19d80 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
19d90 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19da0 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
19db0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
19dc0 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
19dd0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
19de0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
19df0 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
19e00 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
19e10 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
19e20 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
19e30 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
19e40 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
19e50 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
19e60 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
19e70 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
19e80 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
19e90 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
19ea0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
19eb0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
19ec0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
19ed0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
19ee0 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
19ef0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
19f00 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
19f10 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19f20 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
19f30 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
19f40 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
19f50 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
19f60 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
19f70 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
19f80 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
19f90 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
19fa0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
19fb0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
19fc0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
19fd0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
19fe0 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
19ff0 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
1a000 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
1a010 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
1a020 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
1a030 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
1a040 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
1a050 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
1a060 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
1a070 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
1a080 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
1a090 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
1a0a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
1a0b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1a0c0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
1a0d0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
1a0e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
1a0f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
1a100 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a110 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
1a120 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
1a130 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
1a140 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
1a150 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
1a160 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
1a170 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
1a180 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
1a190 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
1a1a0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
1a1b0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
1a1c0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1a1d0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
1a1e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a200 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
1a210 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1a220 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
1a230 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
1a240 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
1a250 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
1a260 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
1a270 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
1a280 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1a290 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1a2a0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1a2b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1a2c0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
1a2d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1a2e0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
1a2f0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1a300 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
1a310 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
1a320 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
1a330 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1a340 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
1a350 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a360 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1a370 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
1a380 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1a390 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
1a3a0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
1a3b0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
1a3c0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
1a3d0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
1a3e0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
1a3f0 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
1a400 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
1a410 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
1a420 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
1a430 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
1a440 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
1a450 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
1a460 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
1a470 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a480 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
1a490 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
1a4a0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
1a4b0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
1a4c0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
1a4d0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
1a4e0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
1a4f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1a500 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
1a510 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
1a520 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
1a530 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
1a540 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
1a550 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
1a560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1a590 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
1a5a0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
1a5b0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
1a5c0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
1a5d0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
1a5e0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
1a5f0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
1a600 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
1a610 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
1a620 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
1a630 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
1a640 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
1a650 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
1a660 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
1a670 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
1a680 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
1a690 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
1a6a0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
1a6b0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
1a6c0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
1a6d0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
1a6e0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
1a6f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1a700 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
1a710 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
1a720 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a740 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1a750 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
1a760 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
1a770 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
1a780 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
1a790 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
1a7a0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
1a7b0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
1a7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
1a7d0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
1a7e0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
1a7f0 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
1a800 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
1a810 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
1a820 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1a830 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
1a840 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
1a850 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
1a860 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
1a870 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
1a880 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
1a890 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
1a8a0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
1a8b0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
1a8c0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
1a8d0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
1a8e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a8f0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
1a900 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
1a910 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
1a920 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
1a930 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
1a940 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a960 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
1a970 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
1a980 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
1a990 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
1a9a0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
1a9b0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
1a9c0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
1a9d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
1a9e0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
1a9f0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
1aa00 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
1aa10 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
1aa20 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
1aa30 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
1aa40 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1aa50 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
1aa60 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
1aa70 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1aa80 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
1aa90 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
1aaa0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
1aab0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
1aac0 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
1aad0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
1aae0 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
1aaf0 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
1ab00 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
1ab10 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
1ab20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1ab30 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
1ab40 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
1ab50 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
1ab60 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
1ab70 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
1ab80 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
1ab90 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
1aba0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
1abb0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
1abc0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
1abd0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1abe0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
1abf0 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
1ac00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1ac10 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
1ac20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1ac30 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
1ac40 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
1ac50 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
1ac60 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
1ac70 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
1ac80 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
1ac90 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
1aca0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
1acb0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
1acc0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
1acd0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
1ace0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1acf0 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
1ad00 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
1ad10 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
1ad20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1ad30 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
1ad40 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1ad50 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
1ad60 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
1ad70 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
1ad80 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
1ad90 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
1ada0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
1adb0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
1adc0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1add0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
1ade0 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
1adf0 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
1ae00 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
1ae10 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
1ae20 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
1ae30 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
1ae40 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
1ae50 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
1ae60 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
1ae70 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
1ae80 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
1ae90 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
1aea0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
1aeb0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
1aec0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
1aed0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
1aee0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1aef0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1af00 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1af10 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1af20 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
1af30 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
1af40 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
1af50 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
1af60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1af70 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
1af80 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
1af90 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
1afa0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
1afb0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
1afc0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
1afd0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
1afe0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
1aff0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
1b000 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1b010 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
1b020 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1b030 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1b040 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  e)==0 .     && p
1b050 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
1b060 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
1b070 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  eSize .    ){.  
1b080 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
1b090 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1b0a0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
1b0b0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
1b0c0 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
1b0d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1b0e0 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1b0f0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1b100 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1b110 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1b120 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1b130 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1b140 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
1b150 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
1b160 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1b170 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
1b180 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b190 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
1b1a0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1b1b0 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
1b1c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b1d0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
1b1e0 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
1b1f0 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73  ze;.    if( nRes
1b200 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
1b210 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
1b220 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
1b230 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
1b240 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
1b250 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
1b260 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
1b270 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
1b280 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
1b290 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1b2a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1b2b0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1b2c0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
1b2d0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
1b2e0 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
1b2f0 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
1b300 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
1b310 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
1b320 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
1b330 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
1b340 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
1b350 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
1b360 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
1b370 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
1b380 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
1b390 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
1b3a0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
1b3b0 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
1b3c0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
1b3d0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
1b3e0 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
1b3f0 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
1b400 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
1b410 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
1b420 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
1b430 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
1b440 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1b450 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1b460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1b470 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
1b480 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
1b490 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
1b4a0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
1b4b0 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
1b4c0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
1b4d0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1b4e0 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
1b4f0 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
1b500 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
1b510 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
1b520 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b530 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
1b540 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
1b550 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
1b560 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
1b570 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
1b580 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
1b590 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
1b5a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
1b5b0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  age){.  int nPag
1b5c0 65 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  e;.  if( mxPage>
1b5d0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
1b5e0 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
1b5f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1b600 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1b610 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  _UNLOCK ){.    s
1b620 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1b630 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1b640 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  age);.    assert
1b650 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
1b660 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 7d 0a 20  >=nPage );.  }. 
1b670 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1b680 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
1b690 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
1b6a0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
1b6b0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
1b6c0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
1b6d0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
1b6e0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
1b6f0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1b700 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
1b710 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
1b720 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
1b730 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1b740 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
1b750 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
1b760 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
1b770 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
1b780 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
1b790 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
1b7a0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
1b7b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
1b7c0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1b7d0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1b7e0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
1b7f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1b800 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
1b810 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
1b820 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
1b830 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
1b840 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
1b850 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1b860 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
1b870 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1b880 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
1b890 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
1b8a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
1b8b0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
1b8c0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
1b8d0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
1b8e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
1b8f0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
1b900 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
1b910 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
1b920 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1b930 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1b940 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
1b950 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
1b960 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b970 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
1b980 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
1b990 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
1b9a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
1b9b0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
1b9c0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
1b9d0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
1b9e0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
1b9f0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
1ba00 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
1ba10 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1ba20 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
1ba30 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1ba40 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
1ba50 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
1ba60 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
1ba70 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1ba80 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
1ba90 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
1baa0 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
1bab0 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
1bac0 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
1bad0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
1bae0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
1baf0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
1bb00 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
1bb10 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
1bb20 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1bb30 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1bb40 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
1bb50 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1bb60 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
1bb70 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1bb80 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
1bb90 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
1bba0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1bbb0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
1bbc0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1bbd0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
1bbe0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
1bbf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1bc00 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
1bc10 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
1bc20 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1bc30 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1bc40 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1bc50 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
1bc60 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
1bc70 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
1bc80 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
1bc90 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
1bca0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
1bcb0 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
1bcc0 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
1bcd0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
1bce0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
1bcf0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
1bd00 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
1bd10 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 20  (pPager) );.#if 
1bd20 30 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  0.  if( pagerUse
1bd30 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1bd40 20 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d     int isInWal =
1bd50 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
1bd60 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67  ite3WalRead(pPag
1bd70 65 72 2d 3e 70 57 61 6c 2c 20 31 2c 20 26 69 73  er->pWal, 1, &is
1bd80 49 6e 57 61 6c 2c 20 4e 2c 20 70 44 65 73 74 29  InWal, N, pDest)
1bd90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1bda0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 49 6e 57  LITE_OK || isInW
1bdb0 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  al ){.      retu
1bdc0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1bdd0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1bde0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1bdf0 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
1be00 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
1be10 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
1be20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1be30 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1be40 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
1be50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1be60 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1be70 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1be80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1be90 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1bea0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1beb0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
1bec0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1bed0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bee0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
1bef0 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e  .** with pPager.
1bf00 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
1bf10 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  is calculated as
1bf20 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e   (<db file size>
1bf30 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a  /<page-size>)..*
1bf40 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
1bf50 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
1bf60 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
1bf70 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
1bf80 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
1bf90 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
1bfa0 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a   1 page file..**
1bfb0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1bfc0 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61   is in error sta
1bfd0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
1bfe0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1bff0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72   then the.** err
1c000 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
1c010 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1c020 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74  and *pnPage left
1c030 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a   unchanged. Or,.
1c040 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ** if the file s
1c050 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20  ystem has to be 
1c060 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20  queried for the 
1c070 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1c080 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72   and.** the quer
1c090 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e  y attempt return
1c0a0 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74  s an IO error, t
1c0b0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1c0c0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1c0d0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1c0e0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
1c0f0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1c100 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1c110 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
1c120 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
1c130 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a  eturned.** and *
1c140 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  pnPage is set to
1c150 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1c160 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1c170 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1c180 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1c190 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1c1a0 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
1c1b0 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
1c1c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
1c1d0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1c1e0 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1c1f0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
1c200 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1c210 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53  s in the file. S
1c220 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61  tore this in nPa
1c230 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ge. */.  if( pPa
1c240 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1c250 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
1c260 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1c270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c280 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c290 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65       /* Error re
1c2a0 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
1c2b0 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36  Size() */.    i6
1c2c0 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1c2d0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69        /* File si
1c2e0 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75  ze in bytes retu
1c2f0 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69  rned by OsFileSi
1c300 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ze() */..    if(
1c310 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1c320 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
1c330 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1c340 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OCK ){.      sql
1c350 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
1c360 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e 50 61  ager->pWal, &nPa
1c370 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ge);.    }..    
1c380 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1c390 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1c3a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1c3b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1c3c0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66  File );.      if
1c3d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c3e0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >fd) ){.        
1c3f0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
1c400 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c410 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1c420 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20 20 20  d, &n)) ){.     
1c430 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
1c440 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1c450 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c460 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1c470 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1c480 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
1c490 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1c4a0 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1c4b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c4c0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1c4d0 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70  o)(n / pPager->p
1c4e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1c4f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1c500 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c510 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1c520 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c530 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1c540 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1c550 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1c560 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c570 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  izeValid = 1;.  
1c580 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1c590 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1c5a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1c5b0 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1c5c0 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ter than the .  
1c5d0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1c5e0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1c5f0 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1c600 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1c610 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1c620 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1c630 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1c640 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1c650 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1c660 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1c670 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPage;.  }..  /*
1c680 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
1c690 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74  variable and ret
1c6a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  urn SQLITE_OK */
1c6b0 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1c6c0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1c6d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1c6e0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
1c6f0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
1c700 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
1c710 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1c720 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
1c730 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
1c740 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
1c750 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c760 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
1c770 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
1c780 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
1c790 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1c7a0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
1c7b0 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
1c7c0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
1c7d0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
1c7e0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
1c7f0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
1c800 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
1c810 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
1c820 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
1c830 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
1c840 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
1c850 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
1c860 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
1c870 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
1c880 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1c890 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
1c8a0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1c8b0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
1c8c0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
1c8d0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
1c8e0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
1c8f0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
1c900 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
1c910 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
1c920 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
1c930 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1c940 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
1c950 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
1c960 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
1c970 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c9a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
1c9b0 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
1c9c0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1c9d0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1c9e0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
1c9f0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
1ca00 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
1ca10 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
1ca20 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
1ca30 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
1ca40 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1ca50 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1ca60 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1ca70 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1ca80 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
1ca90 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
1caa0 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
1cab0 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20  e unknown. It.  
1cac0 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65  ** must not have
1cad0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
1cae0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
1caf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1cb00 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1cb10 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
1cb20 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
1cb30 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1cb40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1cb50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
1cb60 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1cb70 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
1cb80 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
1cb90 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
1cba0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
1cbb0 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
1cbc0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
1cbd0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
1cbe0 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
1cbf0 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
1cc00 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
1cc10 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
1cc20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1cc30 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
1cc40 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1cc50 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
1cc60 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1cc70 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
1cc80 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
1cc90 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
1cca0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1ccb0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
1ccc0 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
1ccd0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
1cce0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
1ccf0 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
1cd00 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
1cd10 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
1cd20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
1cd30 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
1cd40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cd50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
1cd60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1cd70 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1cd80 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
1cd90 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
1cda0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1cdb0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
1cdc0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
1cdd0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
1cde0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1cdf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ce00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1ce10 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
1ce20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
1ce30 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
1ce40 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
1ce50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ce60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ce70 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
1ce80 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
1ce90 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
1cea0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1ceb0 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
1cec0 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
1ced0 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
1cee0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1cef0 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
1cf00 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
1cf10 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
1cf20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1cf30 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
1cf40 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
1cf50 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
1cf60 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
1cf70 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
1cf80 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
1cf90 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
1cfa0 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
1cfb0 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
1cfc0 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
1cfd0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
1cfe0 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
1cff0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
1d000 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
1d010 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
1d020 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
1d030 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1d040 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
1d050 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1d060 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
1d070 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
1d080 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
1d090 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
1d0a0 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
1d0b0 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
1d0c0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
1d0d0 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
1d0e0 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
1d0f0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
1d100 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
1d110 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1d120 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
1d130 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
1d140 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
1d150 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
1d160 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
1d170 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65  haviour would be
1d180 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1d190 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
1d1a0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
1d1b0 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
1d1c0 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
1d1d0 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
1d1e0 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
1d1f0 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
1d200 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
1d210 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1d220 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
1d230 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
1d240 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
1d250 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
1d260 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
1d270 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
1d280 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
1d290 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
1d2a0 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
1d2b0 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
1d2c0 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
1d2d0 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
1d2e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1d2f0 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
1d300 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d310 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
1d320 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
1d330 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d340 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
1d350 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
1d360 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
1d370 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
1d380 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
1d390 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
1d3a0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1d3b0 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
1d3c0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1d3d0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
1d3e0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
1d3f0 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
1d400 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
1d410 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1d420 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
1d430 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
1d440 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
1d450 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
1d460 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1d470 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
1d480 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
1d490 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
1d4a0 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
1d4b0 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
1d4c0 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
1d4d0 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
1d4e0 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
1d4f0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
1d500 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
1d510 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
1d520 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
1d530 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
1d540 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1d550 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
1d560 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1d570 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1d580 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1d590 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
1d5a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1d5b0 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
1d5c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1d5d0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
1d5e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d5f0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1d600 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
1d610 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
1d620 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
1d630 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1d640 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
1d650 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d660 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
1d670 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
1d680 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1d690 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
1d6a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d6b0 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
1d6c0 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
1d6d0 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
1d6e0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
1d6f0 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
1d700 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
1d710 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
1d720 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
1d730 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
1d740 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
1d750 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
1d760 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
1d770 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
1d780 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
1d790 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
1d7a0 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
1d7b0 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
1d7c0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
1d7d0 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
1d7e0 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
1d7f0 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
1d800 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
1d810 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
1d820 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
1d830 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
1d840 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
1d850 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1d860 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
1d870 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
1d880 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1d890 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
1d8a0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1d8b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d8c0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
1d8d0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1d8e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d8f0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
1d900 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1d910 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d920 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1d930 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
1d940 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
1d950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d960 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1d970 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1d980 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
1d990 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1d9a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d9b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
1d9c0 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
1d9d0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
1d9e0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
1d9f0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
1da00 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
1da10 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
1da20 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
1da30 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1da40 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
1da50 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1da60 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
1da70 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
1da80 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
1da90 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
1daa0 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
1dab0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
1dac0 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
1dad0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
1dae0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
1daf0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1db00 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
1db10 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
1db20 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
1db30 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1db40 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
1db50 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1db60 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
1db70 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
1db80 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
1db90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1dba0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
1dbb0 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
1dbc0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
1dbd0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
1dbe0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
1dbf0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
1dc00 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
1dc10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1dc20 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
1dc30 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
1dc40 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
1dc50 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1dc60 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
1dc70 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
1dc80 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
1dc90 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
1dca0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1dcb0 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
1dcc0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
1dcd0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
1dce0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
1dcf0 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
1dd00 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20  ager->pWal,.    
1dd10 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
1dd20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
1dd30 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20  nc_flags), .    
1dd40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1dd50 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50  , pTmp.  );.  pP
1dd60 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
1dd70 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
1dd80 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1dd90 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1dda0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1ddb0 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1ddc0 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
1ddd0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
1dde0 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
1ddf0 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
1de00 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
1de10 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
1de20 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
1de30 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
1de40 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
1de50 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
1de60 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
1de70 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
1de80 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
1de90 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
1dea0 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
1deb0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
1dec0 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
1ded0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
1dee0 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
1def0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
1df00 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
1df10 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1df20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1df30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1df40 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  fd) ){.      pPa
1df50 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70  ger->errCode = p
1df60 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
1df70 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1df80 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
1df90 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1dfa0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
1dfb0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1dfc0 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
1dfd0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1dfe0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
1dff0 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
1e000 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1e010 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
1e020 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1e030 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1e040 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1e050 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
1e060 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
1e070 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
1e080 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
1e090 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
1e0a0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1e0b0 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
1e0c0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
1e0d0 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
1e0e0 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
1e0f0 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
1e100 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
1e110 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
1e120 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
1e130 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
1e140 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
1e150 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
1e160 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
1e170 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1e180 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
1e190 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
1e1a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e1b0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
1e1c0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
1e1d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1e1e0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
1e1f0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1e200 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
1e210 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
1e220 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
1e230 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1e240 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
1e250 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e260 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
1e270 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1e280 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
1e290 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1e2a0 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
1e2b0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
1e2c0 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
1e2d0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
1e2e0 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
1e2f0 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
1e300 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
1e310 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
1e320 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1e330 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
1e340 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
1e350 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
1e360 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
1e370 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
1e380 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
1e390 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1e3a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1e3b0 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1e3c0 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c  flag is not set,
1e3d0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
1e3e0 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f  ion is a.** no-o
1e3f0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
1e400 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
1e410 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
1e420 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a   journal-mode.**
1e430 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20   and the device 
1e440 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e450 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d  of the the file-
1e460 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
1e470 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
1e480 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e490 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
1e4a0 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
1e4b0 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
1e4c0 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
1e4d0 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
1e4e0 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
1e4f0 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
1e500 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
1e510 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
1e520 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
1e530 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
1e540 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
1e550 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
1e560 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
1e570 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
1e580 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1e590 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
1e5a0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
1e5b0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
1e5c0 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
1e5d0 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
1e5e0 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
1e5f0 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
1e600 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1e610 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
1e620 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
1e630 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
1e640 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
1e650 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
1e660 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
1e670 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
1e680 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
1e690 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1e6a0 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
1e6b0 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
1e6c0 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
1e6d0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
1e6e0 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
1e6f0 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
1e700 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
1e710 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
1e720 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
1e730 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1e740 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
1e750 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
1e760 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
1e770 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
1e780 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
1e790 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
1e7a0 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64  * The Pager.need
1e7b0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76  Sync flag is nev
1e7c0 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65  er be set for te
1e7d0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f  mporary files, o
1e7e0 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70  r any.** file op
1e7f0 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  erating in no-sy
1e800 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e  nc mode (Pager.n
1e810 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e  oSync set to non
1e820 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  -zero)..**.** If
1e830 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
1e840 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
1e850 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
1e860 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
1e870 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
1e880 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
1e890 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
1e8a0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
1e8b0 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
1e8c0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1e8d0 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
1e8e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1e8f0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1e900 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
1e910 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
1e920 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e930 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
1e940 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  dSync ){.    ass
1e950 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
1e960 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
1e970 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1e980 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
1e990 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
1e9a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e9d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e9e0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
1e9f0 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
1ea00 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1ea10 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1ea20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ea30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1ea40 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
1ea50 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
1ea60 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1ea70 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
1ea80 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
1ea90 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
1eaa0 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
1eab0 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
1eac0 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
1ead0 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
1eae0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
1eaf0 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
1eb00 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
1eb10 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
1eb20 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1eb30 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
1eb40 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
1eb50 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
1eb60 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1eb70 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
1eb80 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
1eb90 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
1eba0 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
1ebb0 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
1ebc0 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
1ebd0 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
1ebe0 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
1ebf0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
1ec00 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
1ec10 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1ec20 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1ec30 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1ec40 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1ec50 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1ec60 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1ec70 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1ec80 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1ec90 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1eca0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1ecb0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1ecc0 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1ecd0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1ece0 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1ecf0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1ed00 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1ed10 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1ed20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1ed30 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1ed40 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1ed50 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1ed60 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1ed70 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1ed80 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1ed90 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1eda0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1edb0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1edc0 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1edd0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1ede0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1edf0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1ee00 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1ee10 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1ee20 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1ee30 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1ee40 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1ee50 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1ee60 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1ee70 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1ee80 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1ee90 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1eea0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1eeb0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1eec0 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1eed0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1eee0 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1eef0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1ef00 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1ef10 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1ef20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1ef30 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1ef40 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1ef50 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1ef60 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1ef70 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1ef80 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1ef90 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1efa0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1efb0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1efc0 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1efd0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1efe0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1eff0 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1f000 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
1f010 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
1f020 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
1f030 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1f040 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
1f050 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
1f060 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
1f070 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
1f080 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
1f090 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
1f0a0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1f0b0 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
1f0c0 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
1f0d0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
1f0e0 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
1f0f0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1f100 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f110 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
1f120 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
1f130 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
1f140 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1f150 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
1f160 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
1f170 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
1f180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1f190 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
1f1a0 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
1f1b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f1c0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1f1d0 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
1f1e0 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
1f1f0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
1f200 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f210 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1f220 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1f230 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1f240 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f250 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1f260 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1f270 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
1f280 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f290 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
1f2a0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
1f2b0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
1f2c0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
1f2d0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
1f2e0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
1f2f0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
1f300 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
1f310 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
1f320 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
1f330 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
1f340 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
1f350 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
1f360 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1f370 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
1f380 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
1f390 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
1f3a0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
1f3b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
1f3c0 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1f3d0 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
1f3e0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
1f3f0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
1f400 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
1f410 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
1f420 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
1f430 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
1f440 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
1f450 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
1f460 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
1f470 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1f480 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
1f490 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
1f4a0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
1f4b0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
1f4c0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1f4d0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1f4e0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1f4f0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f500 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
1f510 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1f520 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1f530 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1f540 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
1f550 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1f560 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1f570 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f580 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1f590 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1f5a0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
1f5b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f5c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f5d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1f5e0 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
1f5f0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
1f600 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1f610 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1f620 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1f630 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1f640 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1f650 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
1f660 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
1f670 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
1f680 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
1f690 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1f6a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f6b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f6c0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1f6d0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1f6e0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
1f6f0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1f700 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
1f710 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
1f720 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
1f730 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1f740 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
1f750 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
1f760 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1f770 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1f780 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f790 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
1f7a0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1f7b0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1f7c0 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
1f7d0 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
1f7e0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
1f7f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f800 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f810 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f820 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
1f830 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63  ile was just suc
1f840 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64  cessfully synced
1f850 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64  . Set Pager.need
1f860 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20  Sync .    ** to 
1f870 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74  zero and clear t
1f880 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1f890 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70  NC flag on all p
1f8a0 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  agess..    */.  
1f8b0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1f8c0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  nc = 0;.    pPag
1f8d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1f8e0 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ed = 1;.    pPag
1f8f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
1f900 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f910 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Off;.    sqlite3
1f920 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46  PcacheClearSyncF
1f930 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
1f940 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ache);.  }..  re
1f950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f960 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67  }../*.** The arg
1f970 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72  ument is the fir
1f980 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  st in a linked l
1f990 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67  ist of dirty pag
1f9a0 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  es connected.** 
1f9b0 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
1f9c0 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69  rty pointer. Thi
1f9d0 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  s function write
1f9e0 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68  s each one of th
1f9f0 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  e.** in-memory p
1fa00 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
1fa10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fa20 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d   file. The argum
1fa30 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55  ent may.** be NU
1fa40 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67  LL, representing
1fa50 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20   an empty list. 
1fa60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
1fa70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
1fa80 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1fa90 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68  The pager must h
1faa0 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52  old at least a R
1fab0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65  ESERVED lock whe
1fac0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
1fad0 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65  ** is called. Be
1fae0 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79  fore writing any
1faf0 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  thing to the dat
1fb00 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73  abase file, this
1fb10 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72   lock.** is upgr
1fb20 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55  aded to an EXCLU
1fb30 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68  SIVE lock. If th
1fb40 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
1fb50 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51   obtained,.** SQ
1fb60 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1fb70 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74  urned and no dat
1fb80 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
1fb90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fba0 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  e..** .** If the
1fbb0 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70   pager is a temp
1fbc0 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20  -file pager and 
1fbd0 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d  the actual file-
1fbe0 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69  system file.** i
1fbf0 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
1fc00 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  it is created an
1fc10 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  d opened before 
1fc20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20  any data is .** 
1fc30 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a  written out..**.
1fc40 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b  ** Once the lock
1fc50 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64   has been upgrad
1fc60 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73  ed and, if neces
1fc70 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f  sary, the file o
1fc80 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61  pened,.** the pa
1fc90 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
1fca0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1fcb0 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74  ase file in list
1fcc0 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a   order. Writing.
1fcd0 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69  ** a page is ski
1fce0 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73  pped if it meets
1fcf0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
1fd00 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
1fd10 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  a:.**.**   * The
1fd20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
1fd30 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67  greater than Pag
1fd40 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a  er.dbSize, or.**
1fd50 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44     * The PGHDR_D
1fd60 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69  ONT_WRITE flag i
1fd70 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67  s set on the pag
1fd80 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74  e..**.** If writ
1fd90 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63  ing out a page c
1fda0 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61  auses the databa
1fdb0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
1fdc0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
1fdd0 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20  e.** is updated 
1fde0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
1fdf0 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65  page 1 is writte
1fe00 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20  n out, then the 
1fe10 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20  value cached.** 
1fe20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  in Pager.dbFileV
1fe30 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64  ers[] is updated
1fe40 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65   to match the ne
1fe50 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  w value stored i
1fe60 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
1fe70 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1fe80 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
1fe90 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
1fea0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1feb0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
1fec0 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20   .** occurs, an 
1fed0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1fee0 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
1fef0 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  f the EXCLUSIVE 
1ff00 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62  lock cannot.** b
1ff10 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49  e obtained, SQLI
1ff20 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
1ff30 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1ff40 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
1ff50 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
1ff60 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
1ff70 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ff90 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1ffa0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffc0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1ffd0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n code */..  if(
1ffe0 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30 29   NEVER(pList==0)
1fff0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20000 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
20010 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
20020 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
20030 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
20040 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
20050 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
20060 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
20070 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
20080 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
20090 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
200a0 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
200b0 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73  ing.  ** call is
200c0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
200d0 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
200e0 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
200f0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
20100 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
20110 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
20120 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
20130 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
20140 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
20150 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
20160 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
20170 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
20180 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
20190 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
201a0 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
201b0 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
201c0 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
201d0 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
201e0 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
201f0 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
20200 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
20210 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
20220 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
20230 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
20240 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
20250 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
20260 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
20270 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
20280 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
20290 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
202a0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
202b0 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
202c0 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
202d0 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
202e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
202f0 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
20300 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
20310 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
20320 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20330 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
20340 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
20350 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
20360 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
20370 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
20380 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
20390 73 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50 61  seWal(pList->pPa
203a0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
203b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
203c0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
203d0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
203e0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
203f0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
20400 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  OCK);..  /* If t
20410 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
20420 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
20430 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
20440 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
20450 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
20460 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
20470 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
20480 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
20490 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
204a0 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
204b0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
204c0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
204d0 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
204e0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
204f0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
20500 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
20510 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
20520 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
20530 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
20540 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
20550 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
20560 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
20570 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
20580 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
20590 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
205a0 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
205b0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
205c0 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
205d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
205e0 7a 65 20 3e 20 28 70 50 61 67 65 72 2d 3e 64 62  ze > (pPager->db
205f0 4f 72 69 67 53 69 7a 65 2b 31 29 20 26 26 20 69  OrigSize+1) && i
20600 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
20610 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
20620 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
20630 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20640 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
20650 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
20660 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
20670 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
20680 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
20690 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
206a0 73 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20 20  szFile);.  }..  
206b0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
206c0 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
206d0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
206e0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
206f0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
20700 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
20710 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
20720 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
20730 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
20740 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
20750 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
20760 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
20770 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
20780 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
20790 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
207a0 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
207b0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
207c0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
207d0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
207e0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
207f0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
20800 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
20810 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
20820 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
20830 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
20840 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
20850 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
20860 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
20870 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
20880 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
20890 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
208a0 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
208b0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
208c0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
208d0 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
208e0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
208f0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
20900 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
20910 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
20920 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
20950 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
20960 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
20970 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
20980 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
20990 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
209a0 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
209b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
209c0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
209d0 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
209e0 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
209f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20a00 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
20a10 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
20a20 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
20a30 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
20a40 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
20a50 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
20a60 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
20a70 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
20a80 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
20a90 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
20aa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
20ab0 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
20ac0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
20ad0 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
20ae0 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
20af0 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
20b00 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
20b10 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
20b20 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
20b30 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
20b40 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
20b50 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
20b60 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
20b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20b80 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
20b90 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
20ba0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
20bb0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
20bc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
20bd0 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
20be0 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
20bf0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
20c00 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
20c10 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
20c20 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
20c30 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
20c40 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
20c50 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
20c60 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
20c70 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
20c80 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
20ca0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
20cb0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
20cc0 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
20cd0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
20ce0 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
20cf0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
20d00 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
20d10 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
20d20 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
20d30 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
20d40 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
20d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20d60 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
20d70 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
20d80 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
20d90 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
20da0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20db0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
20dc0 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
20dd0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
20de0 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
20df0 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
20e00 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
20e10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20e20 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68  ./*.** Ensure th
20e30 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  at the sub-journ
20e40 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e  al file is open.
20e50 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
20e60 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a  y open, this .**
20e70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
20e80 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  o-op..**.** SQLI
20e90 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20ea0 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  d if everything 
20eb0 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74  goes according t
20ec0 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53  o plan. An .** S
20ed0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
20ee0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
20ef0 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c  turned if a call
20f00 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
20f10 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  n() .** fails..*
20f20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
20f30 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
20f40 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
20f50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20f60 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
20f70 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
20f80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
20f90 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
20fa0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20fb0 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72  MEMORY || pPager
20fc0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29  ->subjInMemory )
20fd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
20fe0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
20ff0 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
21000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
21010 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
21020 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
21030 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
21040 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
21050 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21060 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21070 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
21080 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
21090 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
210a0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
210b0 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
210c0 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
210d0 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
210e0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
210f0 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
21100 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
21110 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
21120 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
21130 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
21140 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
21150 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
21160 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
21170 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
21180 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
21190 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
211a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
211b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
211c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
211d0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
211e0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
211f0 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
21200 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
21210 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
21220 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
21230 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
21240 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
21250 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
21260 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
21270 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
21280 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
21290 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
212a0 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
212b0 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
212c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
212d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
212e0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
212f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
21300 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
21310 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
21320 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
21330 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
21340 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
21350 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
21360 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
21370 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
21380 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
21390 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
213a0 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
213b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
213c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
213d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
213e0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
213f0 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
21400 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
21410 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
21420 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
21430 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20  urnal(pPg) .    
21440 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e       || pPg->pgn
21450 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  o>pPager->dbOrig
21460 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20  Size .    );.   
21470 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
21480 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20  rnal(pPager);.. 
21490 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
214a0 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65  -journal was ope
214b0 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
214c0 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79   (or was already
214d0 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77   open),.    ** w
214e0 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rite the journal
214f0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
21500 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69   file.  */.    i
21510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21520 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
21530 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
21540 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  ta;.      i64 of
21550 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  fset = pPager->n
21560 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
21570 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
21580 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
21590 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32  .  .      CODEC2
215a0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
215b0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
215c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
215d0 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
215e0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
215f0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
21600 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
21610 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
21620 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
21630 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
21640 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
21650 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
21660 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
21670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21680 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21690 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
216a0 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
216b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
216c0 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
216d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
216e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
216f0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
21700 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
21710 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21720 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
21730 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
21740 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
21750 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
21760 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21770 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
21780 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
21790 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
217a0 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
217b0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
217c0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
217d0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
217e0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
217f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
21800 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
21810 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
21820 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
21830 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
21840 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
21850 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
21860 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
21870 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
21880 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
21890 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
218a0 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
218b0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
218c0 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
218d0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
218e0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
218f0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
21900 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
21910 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
21920 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
21930 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
21940 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
21950 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
21960 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
21970 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
21980 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
21990 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
219a0 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
219b0 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
219c0 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
219d0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
219e0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
219f0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
21a00 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
21a10 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
21a20 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
21a30 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
21a40 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
21a50 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
21a60 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
21a70 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
21a80 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
21a90 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
21aa0 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
21ab0 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
21ac0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
21ad0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
21ae0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
21af0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
21b00 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
21b10 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
21b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
21b30 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
21b40 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
21b50 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21b60 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
21b70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21b80 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
21b90 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
21ba0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
21bb0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
21bc0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
21bd0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  he doNotSpill fl
21be0 61 67 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  ag is set during
21bf0 20 74 69 6d 65 73 20 77 68 65 6e 20 77 72 69 74   times when writ
21c00 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
21c10 61 6c 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 6c  al.  ** is disal
21c20 6c 6f 77 65 64 3a 20 20 28 31 29 20 64 75 72 69  lowed:  (1) duri
21c30 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
21c40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
21c50 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73  while it.  ** is
21c60 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73   journalling a s
21c70 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  et of two or mor
21c80 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  e database pages
21c90 20 74 68 61 74 20 61 72 65 20 73 74 6f 72 65 64   that are stored
21ca0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d  .  ** on the sam
21cb0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2c 20 61  e disk sector, a
21cc0 6e 64 20 28 32 29 20 77 68 69 6c 65 20 70 65 72  nd (2) while per
21cd0 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62 61  forming a rollba
21ce0 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69  ck..  **.  ** Si
21cf0 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20  milarly, if the 
21d00 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
21d10 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72  y entered the er
21d20 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f  ror state, do no
21d30 74 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72  t.  ** try to wr
21d40 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
21d50 20 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e   of pPg to disk.
21d60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
21d70 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70  er->errCode || p
21d80 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
21d90 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
21da0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
21db0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
21dc0 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
21dd0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21de0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
21df0 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
21e00 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
21e10 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28   log. */.    if(
21e20 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
21e30 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20  e(pPg) ){ .     
21e40 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
21e50 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20  Page(pPg); .    
21e60 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
21e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21e80 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
21e90 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
21ea0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
21eb0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
21ec0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
21ed0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
21ee0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
21ef0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
21f00 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
21f10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
21f20 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
21f30 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
21f40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
21f50 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
21f60 0a 20 20 20 20 20 20 20 20 21 28 70 50 61 67 65  .        !(pPage
21f70 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
21f80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21f90 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20  E_MEMORY) &&.   
21fa0 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73       !(sqlite3Os
21fb0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
21fc0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
21fd0 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
21fe0 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20  AFE_APPEND).    
21ff0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61    ){.        pPa
22000 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
22010 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
22020 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
22030 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
22040 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
22050 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
22060 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20  of this page is 
22070 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
22080 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
22090 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
220a0 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61  ase image, it ma
220b0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69  y need to be wri
220c0 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  tten to the sub-
220d0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20  journal..    ** 
220e0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
220f0 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  the call to page
22100 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
22110 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f  () below will no
22120 74 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c  t.    ** actuall
22130 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20  y write data to 
22140 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73  the file in this
22150 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   case..    **.  
22160 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68    ** Consider th
22170 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75  e following sequ
22180 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a  ence of events:.
22190 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
221a0 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20  BEGIN;.    **   
221b0 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
221c0 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d  X>.    **     <m
221d0 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20  odify page X>.  
221e0 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49    **     SAVEPOI
221f0 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20  NT sp;.    **   
22200 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61      <shrink data
22210 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70  base file to Y p
22220 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ages>.    **    
22230 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70     pagerStress(p
22240 61 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20  age X).    **   
22250 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70    ROLLBACK TO sp
22260 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
22270 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77  If (X>Y), then w
22280 68 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20  hen pagerStress 
22290 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58  is called page X
222a0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
222b0 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20  tten.    ** out 
222c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
222d0 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62  file, but will b
222e0 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
222f0 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a  he cache. Then,.
22300 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
22310 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
22320 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c  O sp" statement,
22330 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20   reading page X 
22340 77 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a  will read.    **
22350 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
22360 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
22370 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  is will be the c
22380 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73  opy of page X as
22390 20 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77   it.    ** was w
223a0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
223b0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74  ion started, not
223c0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
223d0 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20  "SAVEPOINT sp". 
223e0 20 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74     ** was execut
223f0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
22400 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
22410 73 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  s to write the c
22420 75 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20  urrent data for 
22430 70 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20  page X into the 
22440 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  .    ** sub-jour
22450 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66  nal file now (if
22460 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
22470 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68  dy there), so th
22480 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a  at it will.    *
22490 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  * be restored to
224a0 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
224b0 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ue when the "ROL
224c0 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20  LBACK TO sp" is 
224d0 0a 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64  .    ** executed
224e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
224f0 20 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20 20   NEVER(.        
22500 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22510 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
22520 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62  r->dbSize && sub
22530 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
22540 67 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20  g).    ) ){.    
22550 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
22560 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
22570 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74  }.  .    /* Writ
22580 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
22590 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
225a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
225b0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
225c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
225d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
225e0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
225f0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
22600 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
22610 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
22620 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
22630 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
22640 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
22650 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
22660 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
22670 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
22680 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
22690 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
226a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
226b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
226c0 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   rc);.}.../*.** 
226d0 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
226e0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
226f0 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
22700 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
22710 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
22720 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
22730 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
22740 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
22750 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
22760 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
22770 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
22780 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
22790 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
227a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
227b0 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
227c0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
227d0 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
227e0 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
227f0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
22800 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
22810 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
22820 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
22830 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
22840 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
22850 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
22860 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
22870 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
22880 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
22890 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
228a0 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
228b0 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
228c0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
228d0 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
228e0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
228f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
22900 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
22910 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
22920 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
22930 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
22940 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
22950 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
22960 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
22970 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
22980 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
22990 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
229a0 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
229b0 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
229c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
229d0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
229e0 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
229f0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
22a00 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
22a10 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
22a20 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
22a30 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
22a40 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
22a50 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
22a60 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
22a70 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  d PAGER_NO_READL
22a80 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  OCK flags..**.**
22a90 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
22aa0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
22ab0 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
22ac0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
22ad0 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
22ae0 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
22af0 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
22b00 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
22b10 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
22b20 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
22b30 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
22b40 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
22b50 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
22b60 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
22b70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22b80 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
22b90 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
22ba0 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
22bb0 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
22bc0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
22bd0 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
22be0 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
22bf0 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
22c00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
22c10 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
22c20 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
22c30 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
22c40 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
22c50 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
22c60 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
22c70 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
22c80 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
22c90 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22ca0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
22cb0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
22cc0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
22cd0 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
22ce0 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
22cf0 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
22d00 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
22d10 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
22d20 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
22d30 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
22d40 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
22d50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22d60 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
22d70 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
22d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
22d90 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
22da0 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
22db0 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
22dc0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
22dd0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
22de0 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
22df0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
22e00 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
22e10 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
22e20 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
22e30 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
22e40 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
22e50 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
22e60 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
22e70 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
22e80 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
22e90 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
22ea0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
22eb0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
22ec0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
22ed0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
22ee0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
22ef0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22f00 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
22f10 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
22f20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
22f30 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
22f40 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
22f50 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
22f60 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
22f70 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
22f80 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
22f90 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
22fa0 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
22fb0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
22fc0 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
22fd0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
22fe0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
22ff0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
23000 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
23010 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
23020 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
23030 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
23040 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
23050 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
23060 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
23070 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23080 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
23090 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
230a0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
230b0 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
230c0 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
230d0 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
230e0 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  rnal */.  int no
230f0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
23100 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
23110 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54  DLOCK)!=0;  /* T
23120 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64  rue to omit read
23130 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  -lock */.  int p
23140 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
23150 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
23160 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
23170 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
23180 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20  PCache */.  u16 
23190 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
231a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
231b0 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
231c0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
231d0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
231e0 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
231f0 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
23200 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
23210 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
23220 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
23230 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
23240 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
23250 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
23260 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
23270 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
23280 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
23290 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
232a0 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
232b0 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
232c0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
232d0 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
232e0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
232f0 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
23300 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
23310 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
23320 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
23330 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
23340 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
23350 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
23360 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
23370 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
23380 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
23390 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
233a0 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
233b0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
233c0 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
233d0 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
233e0 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
233f0 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
23400 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
23410 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
23420 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
23430 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
23440 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
23450 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
23460 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
23470 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
23480 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
23490 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
234a0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
234b0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
234c0 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
234d0 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
234e0 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
234f0 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
23500 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
23510 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
23520 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
23530 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23540 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
23550 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
23560 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
23570 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
23580 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
23590 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
235a0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
235b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
235c0 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
235d0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
235e0 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
235f0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
23600 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
23610 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
23620 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
23630 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
23640 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
23650 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
23660 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
23670 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
23680 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
23690 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 0;.    }else
236a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
236b0 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
236c0 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
236d0 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
236e0 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
236f0 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
23700 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23710 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
23720 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
23730 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
23740 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  hname);.    }.. 
23750 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
23760 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
23770 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
23780 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23790 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
237a0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
237b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
237c0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
237d0 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
237e0 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
237f0 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
23800 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
23810 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
23820 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
23830 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
23840 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
23850 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
23860 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
23870 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
23880 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
23890 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
238a0 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
238b0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
238c0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
238d0 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
238e0 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
238f0 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
23900 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
23910 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
23920 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
23930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23940 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23950 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
23960 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23970 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
23980 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
23990 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
239a0 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a  ture, PCache obj
239b0 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68  ect, the.  ** th
239c0 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ree file descrip
239d0 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61  tors, the databa
239e0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  se file name and
239f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
23a00 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68  ** file name. Th
23a10 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f  e layout in memo
23a20 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ry is as follows
23a30 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
23a40 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20  Pager object    
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a60 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62  (sizeof(Pager) b
23a70 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50  ytes).  **     P
23a80 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20  Cache object    
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
23aa0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
23ab0 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e() bytes).  ** 
23ac0 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
23ad0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
23ae0 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46      (pVfs->szOsF
23af0 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ile bytes).  ** 
23b00 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20      Sub-journal 
23b10 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
23b20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
23b30 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
23b40 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61       Main journa
23b50 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
23b60 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
23b70 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
23b80 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
23b90 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
23ba0 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
23bb0 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  +1 bytes).  **  
23bc0 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
23bd0 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
23be0 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b     (nPathname+8+
23bf0 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20  1 bytes).  */.  
23c00 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c  pPtr = (u8 *)sql
23c10 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
23c20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
23c30 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20  f(*pPager)) +   
23c40 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
23c50 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55  cture */.    ROU
23c60 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20  ND8(pcacheSize) 
23c70 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
23c80 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Cache object */.
23c90 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d      ROUND8(pVfs-
23ca0 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20  >szOsFile) +    
23cb0 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
23cc0 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f  b file */.    jo
23cd0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20  urnalFileSize * 
23ce0 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2 +          /* 
23cf0 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  The two journal 
23d00 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50  files */ .    nP
23d10 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20  athname + 1 +   
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23d30 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20  zFilename */.   
23d40 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b   nPathname + 8 +
23d50 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
23d60 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  /* zJournal */. 
23d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
23d80 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
23d90 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
23da0 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
23db0 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
23dc0 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
23dd0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
23de0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
23df0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23e00 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
23e10 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
23e20 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
23e30 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
23e40 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
23e50 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
23e60 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20  f(*pPager)));.  
23e70 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28  pPager->fd =   (
23e80 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
23e90 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63  Ptr += ROUND8(pc
23ea0 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50  acheSize));.  pP
23eb0 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
23ec0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
23ed0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73  r += ROUND8(pVfs
23ee0 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20  ->szOsFile));.  
23ef0 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28  pPager->jfd =  (
23f00 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
23f10 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
23f20 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
23f30 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20  r->zFilename =  
23f40 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b    (char*)(pPtr +
23f50 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
23f60 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  e);.  assert( EI
23f70 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
23f80 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  NT(pPager->jfd) 
23f90 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
23fa0 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65   the Pager.zFile
23fb0 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a  name and Pager.z
23fc0 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c  Journal buffers,
23fd0 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   if required. */
23fe0 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
23ff0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24000 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
24010 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
24020 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20  thname + 1);.   
24030 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
24040 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
24050 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
24060 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
24070 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
24080 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
24090 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
240a0 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
240b0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
240c0 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20  -journal", 8);. 
240d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a     if( pPager->z
240e0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29  Filename[0]==0 )
240f0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
24100 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  l[0] = 0;.    sq
24110 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
24120 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  name);.  }.  pPa
24130 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ger->pVfs = pVfs
24140 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
24150 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
24160 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
24170 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f  pager file..  */
24180 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
24190 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
241a0 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20   && !memDb ){.  
241b0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241d0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
241e0 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
241f0 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
24200 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
24210 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
24220 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
24230 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
24240 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  ut);.    readOnl
24250 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
24260 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
24270 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
24280 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
24290 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
242a0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
242b0 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
242c0 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
242d0 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
242e0 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
242f0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
24300 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
24310 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
24320 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
24330 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
24340 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
24350 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
24360 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
24370 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
24380 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
24390 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
243a0 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
243b0 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
243c0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
243d0 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
243e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
243f0 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f  ITE_OK && !readO
24400 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74  nly ){.      set
24410 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
24420 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
24430 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
24440 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
24450 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
24460 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
24470 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
24480 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
24490 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
244a0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
244b0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
244c0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
244d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a   ){.          sz
244e0 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
244f0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
24500 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
24510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24520 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
24530 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u16)pPager->sect
24540 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
24550 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  }.      }.#ifdef
24560 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
24570 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
24580 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
24590 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
245a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
245b0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
245c0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69  ;.        int ii
245d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
245e0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
245f0 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
24600 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
24610 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
24620 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
24630 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
24640 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
24650 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
24660 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
24670 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
24680 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
24690 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
246a0 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
246b0 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2){.          if
246c0 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
246d0 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
246e0 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  8)) ){.         
246f0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
24700 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
24710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24720 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
24730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
24740 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
24750 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
24760 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
24770 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
24780 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
24790 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
247a0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
247b0 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
247c0 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
247d0 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
247e0 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
247f0 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
24800 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
24810 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
24820 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
24830 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
24840 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
24850 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
24860 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
24870 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
24880 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
24890 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
248a0 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
248b0 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
248c0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
248d0 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  / .    tempFile 
248e0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
248f0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
24900 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 72 65  XCLUSIVE;.    re
24910 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61  adOnly = (vfsFla
24920 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs&SQLITE_OPEN_R
24930 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20  EADONLY);.  }.. 
24940 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
24950 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53  g call to PagerS
24960 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72  etPagesize() ser
24970 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76  ves to set the v
24980 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61  alue of .  ** Pa
24990 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64  ger.pageSize and
249a0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
249b0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
249c0 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
249d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
249e0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
249f0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
24a00 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
24a10 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
24a20 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
24a30 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a  zPageDflt, -1);.
24a40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
24a50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
24a60 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
24a70 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
24a80 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
24a90 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65  locks above, fre
24aa0 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
24ab0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
24ac0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
24ad0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
24ae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24af0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
24b00 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20  >pTmpSpace );.  
24b10 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
24b20 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
24b30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24b40 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
24b50 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
24b60 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
24b70 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
24b80 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  /.  assert( nExt
24b90 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78  ra<1000 );.  nEx
24ba0 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
24bb0 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  tra);.  sqlite3P
24bc0 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
24bd0 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
24be0 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
24bf0 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
24c00 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
24c10 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
24c20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
24c30 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
24c40 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
24c50 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
24c60 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
24c70 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
24c80 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
24c90 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
24ca0 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
24cb0 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
24cc0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
24cd0 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
24ce0 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
24cf0 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63  ock = (noReadloc
24d00 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f  k && readOnly) ?
24d10 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  1:0;.  /* pPager
24d20 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
24d30 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
24d40 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
24d50 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
24d60 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
24d70 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
24d80 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  d = (u8)memDb;. 
24d90 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
24da0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
24db0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
24dc0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
24dd0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
24de0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
24df0 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
24e00 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
24e10 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
24e20 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
24e30 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  CK; */.  assert(
24e40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
24e50 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
24e60 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
24e70 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
24e80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
24e90 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
24ea0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
24eb0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
24ec0 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
24ed0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
24ee0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
24ef0 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
24f00 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
24f10 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
24f20 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
24f30 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
24f40 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
24f50 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
24f60 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
24f70 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
24f80 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
24f90 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
24fa0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
24fb0 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
24fc0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
24fd0 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
24fe0 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61  adOnly;.  /* pPa
24ff0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
25000 30 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  0; */.  assert( 
25010 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50  useJournal || pP
25020 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
25030 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  ;.  pPager->noSy
25040 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
25050 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
25060 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67  >fullSync = pPag
25070 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b  er->noSync ?0:1;
25080 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  .  pPager->sync_
25090 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  flags = SQLITE_S
250a0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a  YNC_NORMAL;.  /*
250b0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
250c0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
250d0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
250e0 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
250f0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
25100 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
25110 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
25120 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
25130 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
25140 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
25150 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
25160 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
25170 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
25180 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
25190 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
251a0 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
251b0 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
251c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
251d0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
251e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
251f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
25200 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
25210 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
25220 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
25230 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
25240 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
25250 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
25260 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
25270 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
25280 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
25290 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
252a0 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
252b0 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
252c0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
252d0 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a  aHash)); */..  *
252e0 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
252f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25300 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
25310 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25320 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
25330 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
25340 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
25350 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
25360 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
25370 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
25380 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
25390 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
253a0 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
253b0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
253c0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
253d0 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
253e0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
253f0 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
25400 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
25410 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
25420 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
25430 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
25440 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
25450 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
25460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
25470 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
25480 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
25490 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
254a0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
254b0 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
254c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
254d0 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
254e0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
254f0 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
25500 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
25510 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
25520 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
25530 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
25540 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
25550 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
25560 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
25570 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
25580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
25590 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
255a0 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
255b0 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
255c0 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
255d0 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
255e0 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
255f0 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
25600 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
25610 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
25620 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
25630 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
25640 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
25650 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
25660 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
25670 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
25680 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
25690 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
256a0 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
256b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
256c0 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
256d0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
256e0 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
256f0 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
25700 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
25710 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
25720 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
25730 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
25740 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
25750 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
25760 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
25770 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
25780 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
25790 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
257a0 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
257b0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
257c0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
257d0 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
257e0 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
257f0 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
25800 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
25810 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
25820 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
25830 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
25840 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
25850 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
25860 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
25870 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
25880 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
25890 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
258a0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
258b0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
258c0 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
258d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
258e0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
258f0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
25900 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
25910 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
25920 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
25930 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
25940 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
25950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
25960 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
25970 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
25980 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
25990 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
259a0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
259b0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
259c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
259d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
259e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
259f0 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
25a00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25a10 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
25a20 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
25a30 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
25a40 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
25a50 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
25a60 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
25a70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25a80 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
25a90 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
25aa0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
25ab0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25ac0 3e 73 74 61 74 65 20 3c 3d 20 50 41 47 45 52 5f  >state <= PAGER_
25ad0 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65  SHARED );.  asse
25ae0 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20  rt( jrnlOpen==0 
25af0 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65  || ( sqlite3OsDe
25b00 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
25b10 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ics(pPager->jfd)
25b20 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f   &.    SQLITE_IO
25b30 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
25b40 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a  WHEN_OPEN.  ));.
25b50 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
25b60 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e  .  if( !jrnlOpen
25b70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
25b80 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
25b90 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
25ba0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
25bb0 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
25bc0 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ts);.  }.  if( r
25bd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25be0 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
25bf0 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20 20  t locked;       
25c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
25c10 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
25c20 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
25c30 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
25c40 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
25c50 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
25c60 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
25c70 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
25c80 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
25c90 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
25ca0 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
25cb0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
25cc0 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
25cd0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
25ce0 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
25cf0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
25d00 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
25d10 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
25d20 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
25d30 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
25d40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
25d50 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
25d60 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
25d70 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
25d80 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
25d90 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
25da0 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
25db0 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
25dc0 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
25dd0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
25de0 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
25df0 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
25e00 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
25e10 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
25e20 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
25e30 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
25e40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
25e50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
25e60 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
25e70 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
25e80 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
25e90 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
25ea0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20  nt nPage;..     
25eb0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69   /* Check the si
25ec0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
25ed0 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 63  se file. If it c
25ee0 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61 67  onsists of 0 pag
25ef0 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  es,.      ** the
25f00 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
25f10 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20 74  rnal file. See t
25f20 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e  he header commen
25f30 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20 20  t above for .   
25f40 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e     ** the reason
25f50 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65 74  ing here.  Delet
25f60 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a  e the obsolete j
25f70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65  ournal file unde
25f80 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45 53  r.      ** a RES
25f90 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76  ERVED lock to av
25fa0 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74 69  oid race conditi
25fb0 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69 64  ons and to avoid
25fc0 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20   violating.     
25fd0 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20   ** [H33020]..  
25fe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
25ff0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
26000 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
26010 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
26020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26030 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26040 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
26050 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
26060 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
26070 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26080 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
26090 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
260a0 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
260b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
260c0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
260d0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
260e0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
260f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26100 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
26110 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
26120 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
26130 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26140 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
26150 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
26160 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
26170 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
26180 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
26190 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
261a0 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
261b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
261c0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
261d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
261e0 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
261f0 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
26200 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
26210 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
26220 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
26230 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
26240 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
26250 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
26260 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
26270 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
26280 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
26290 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
262a0 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
262b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
262c0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
262d0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
262e0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
262f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
26300 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
26310 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
26320 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26330 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
26340 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
26350 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
26360 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
26370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
26380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
263a0 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
263b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
263c0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
263d0 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
263e0 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
263f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
26400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
26410 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
26430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26440 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26450 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
26460 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
26470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
26480 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
26490 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
264a0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
264b0 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
264c0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
264d0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
264e0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
264f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26500 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
26510 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
26520 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
26530 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
26540 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
26550 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
26560 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
26570 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
26580 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
26590 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
265a0 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
265b0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
265c0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
265d0 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
265e0 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
265f0 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
26600 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
26610 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
26620 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
26630 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
26640 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
26650 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
26660 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
26670 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
26680 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
26690 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
266a0 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
266b0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
266c0 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
266d0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
266e0 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
266f0 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
26700 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
26710 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
26720 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
26730 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26740 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
26750 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
26760 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26770 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26790 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
267a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
267b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
267c0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
267d0 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
267e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
267f0 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69  file..** It is i
26800 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73  llegal to call s
26810 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
26820 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72  re() until after
26830 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
26840 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  * has been succe
26850 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20  ssfully called. 
26860 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  If a shared-lock
26870 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
26880 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   when.** this fu
26890 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
268a0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
268b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
268c0 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  wing operations 
268d0 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d  are also perform
268e0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
268f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ion..**.**   1) 
26900 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
26910 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
26920 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
26930 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a  (no lock held.**
26940 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
26950 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65  abase file), the
26960 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
26970 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  made to obtain a
26980 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20  .**      SHARED 
26990 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
269a0 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64  base file. Immed
269b0 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
269c0 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  aining.**      t
269d0 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
269e0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
269f0 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
26a00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a   hot-journal,.**
26a10 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70        which is p
26a20 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72  layed back if pr
26a30 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67  esent. Following
26a40 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   any hot-journal
26a50 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61   .**      rollba
26a60 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ck, the contents
26a70 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72   of the cache ar
26a80 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63  e validated by c
26a90 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  hecking.**      
26aa0 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e  the 'change-coun
26ab0 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68  ter' field of th
26ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26ad0 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20  header and.**   
26ae0 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20     discarded if 
26af0 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74  they are found t
26b00 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  o be invalid..**
26b10 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20  .**   2) If the 
26b20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
26b30 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
26b40 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  de, and there ar
26b50 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  e currently.**  
26b60 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69      no outstandi
26b70 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
26b80 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20   any pages, and 
26b90 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
26ba0 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74  state,.**      t
26bb0 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
26bc0 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20  s made to clear 
26bd0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
26be0 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a  by discarding.**
26bf0 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e        the conten
26c00 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
26c10 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67  ache and rolling
26c20 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a   back any open j
26c30 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66  ournal.**      f
26c40 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
26c50 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63  e operation desc
26c60 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62 6f  ribed by (2) abo
26c70 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ve is not attemp
26c80 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a  ted, and if the.
26c90 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  ** pager is in a
26ca0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
26cb0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
26cc0 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69  FULL when this i
26cd0 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65  s called,.** the
26ce0 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
26cf0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
26d00 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69  ned. It is permi
26d10 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  tted to read the
26d20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68 65  .** database whe
26d30 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  n in SQLITE_FULL
26d40 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
26d50 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
26d60 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
26d70 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
26d80 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26d90 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65  d. If an.** IO e
26da0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
26db0 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
26dc0 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
26dd0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
26de0 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f  al.** file or ro
26df0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
26e00 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
26e10 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
26e20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
26e30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
26e40 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
26e50 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
26e60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e80 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
26e90 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65   int isErrorRese
26ea0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
26eb0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
26ec0 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65  ecovering from e
26ed0 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20  rror state */.. 
26ee0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
26ef0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
26f00 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
26f10 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
26f20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
26f30 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  tanding pages */
26f40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26f50 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
26f60 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
26f70 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  )==0 );.  if( NE
26f80 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
26f90 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
26fa0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
26fb0 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a  errCode; }..  /*
26fc0 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73   If this databas
26fd0 65 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  e is in an error
26fe0 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 61  -state, now is a
26ff0 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72   chance to clear
27000 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  .  ** the error.
27010 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
27020 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
27030 65 72 2d 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  er-cache and rol
27040 6c 62 61 63 6b 0a 20 20 2a 2a 20 61 6e 79 20 68  lback.  ** any h
27050 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68  ot journal in th
27060 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20  e file-system.. 
27070 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
27080 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
27090 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
270a0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
270b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a  er->zJournal ){.
270c0 20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65 73        isErrorRes
270d0 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  et = 1;.    }.  
270e0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
270f0 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
27100 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
27110 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
27120 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
27130 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63  Pager) ){.    rc
27140 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65 61   = pagerBeginRea
27150 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
27160 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ger);.  }else if
27170 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
27180 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
27190 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
271a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
271b0 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
271c0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
271d0 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e    int isHotJourn
271e0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  al = 0;.    asse
271f0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
27200 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27210 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
27220 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
27230 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
27240 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
27250 6b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  k ){.      asser
27260 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  t( pPager->readO
27270 6e 6c 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61  nly );.      pPa
27280 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
27290 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
272a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
272b0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
272c0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
272d0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
272e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
272f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27300 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
27310 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
27320 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
27330 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
27340 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
27350 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
27360 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
27370 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
27380 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
27390 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
273a0 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
273b0 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
273c0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
273d0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
273e0 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
273f0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
27400 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
27410 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
27420 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74  f( !isErrorReset
27430 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
27440 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
27450 3c 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  <= PAGER_SHARED 
27460 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  );.      rc = ha
27470 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
27480 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61  er, &isHotJourna
27490 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
274a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
274b0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
274c0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
274d0 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72 72 6f  }.    if( isErro
274e0 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a  rReset || isHotJ
274f0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
27500 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
27510 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
27520 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
27530 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
27540 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
27550 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
27560 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
27570 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
27580 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
27590 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
275a0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
275b0 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
275c0 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
275d0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
275e0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
275f0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
27600 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
27610 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
27620 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
27630 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
27640 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
27650 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
27660 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
27670 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
27680 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
27690 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
276a0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
276b0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
276c0 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
276d0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
276e0 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
276f0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
27700 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
27710 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
27720 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
27730 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
27740 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
27750 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
27760 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
27770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27780 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
27790 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
277a0 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c  tate<EXCLUSIVE_L
277b0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  OCK ){.        r
277c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
277d0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
277e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
277f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27800 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27810 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
27820 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
27830 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  c);.          go
27840 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
27850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
27860 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
27870 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
27880 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
27890 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
278a0 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  l for read/write
278b0 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73   access. This is
278c0 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20   because in .   
278d0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
278e0 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
278f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
27900 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
27910 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70  n and.      ** p
27920 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
27930 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
27940 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
27950 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
27960 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74      ** OsTruncat
27970 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e  e() call used in
27980 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
27990 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75  s mode also requ
279a0 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20  ires.      ** a 
279b0 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20  read/write file 
279c0 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  handle..      */
279d0 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
279e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
279f0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
27a00 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
27a10 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
27a20 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
27a30 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
27a40 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
27a50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27a60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27a70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
27a80 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
27a90 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
27aa0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
27ab0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
27ac0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
27ad0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
27ae0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  L;.            a
27af0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
27b00 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
27b10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27b20 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
27b30 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
27b40 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
27b50 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
27b60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
27b70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
27b80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27b90 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
27ba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27bb0 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
27bc0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
27bd0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
27be0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
27bf0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
27c00 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27c10 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
27c20 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
27c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27c50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
27c60 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
27c70 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
27c80 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
27c90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
27ca0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
27cb0 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
27cc0 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
27cd0 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
27ce0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
27cf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61   connection obta
27d00 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69  ined the exclusi
27d10 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f  ve lock above. O
27d20 72 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20 20  r, it .         
27d30 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
27d40 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
27d50 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
27d60 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
27d70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75             ** fu
27d80 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
27d90 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
27da0 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
27db0 65 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  exist.  */.     
27dc0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
27dd0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
27de0 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
27df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27e00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27e10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27e20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
27e30 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
27e40 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65    }..      /* Re
27e50 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  set the journal 
27e60 73 74 61 74 75 73 20 66 69 65 6c 64 73 20 74 6f  status fields to
27e70 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
27e80 77 65 20 68 61 76 65 20 6e 6f 0a 20 20 20 20 20  we have no.     
27e90 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
27ea0 72 6e 61 6c 20 61 74 20 74 68 69 73 20 74 69 6d  rnal at this tim
27eb0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  e. */.      pPag
27ec0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
27ed0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ed = 0;.      pP
27ee0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
27ef0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
27f00 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
27f10 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
27f20 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
27f30 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  . .      /* Make
27f40 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
27f50 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
27f60 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
27f70 2a 2f 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c  */. .      /* Pl
27f80 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
27f90 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
27fa0 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
27fb0 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
27fc0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
27fd0 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
27fe0 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
27ff0 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
28000 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
28010 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
28020 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
28030 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
28040 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
28050 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
28060 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
28070 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
28080 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
28090 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
280a0 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
280b0 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
280c0 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
280d0 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
280e0 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
280f0 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
28100 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
28110 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
28120 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
28130 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
28140 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
28150 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28160 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  fd) ){.        r
28170 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
28180 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
28190 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
281a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
281b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
281c0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
281d0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
281e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
281f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28200 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
28210 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
28220 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
28230 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
28240 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
28260 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
28270 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
28280 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
28290 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
282a0 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
282b0 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
282c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
282d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
282e0 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74  pBackup || sqlit
282f0 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
28300 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
28310 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)>0 ){.      /*
28320 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
28330 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
28340 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
28350 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
28360 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
28370 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
28380 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
28390 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
283a0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
283b0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
283c0 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
283d0 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
283e0 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
283f0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
28400 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
28410 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
28420 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
28430 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
28440 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
28450 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
28460 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
28470 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
28480 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
28490 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
284a0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
284b0 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
284c0 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
284d0 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
284e0 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
284f0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
28500 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
28510 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
28520 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
28530 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
28540 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
28550 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
28560 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
28570 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
28580 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
28590 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
285a0 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
285b0 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
285c0 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
285d0 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
285e0 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
285f0 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
28600 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
28610 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
28620 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
28630 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
28640 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  ;.      char dbF
28650 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
28660 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
28670 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
28680 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
28690 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
286a0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
286b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
286c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
286d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
286e0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
286f0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
28700 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
28710 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28720 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
28730 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
28740 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
28750 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28760 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
28770 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
28780 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
28790 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
287a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
287b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
287c0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
287d0 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
287e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
287f0 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
28800 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
28810 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
28820 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
28830 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
28840 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
28850 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
28860 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
28870 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
28880 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
28890 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
288a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
288b0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
288c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
288d0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
288e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
288f0 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69   is a WAL file i
28900 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
28910 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74  m, open this dat
28920 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20  abase in WAL.   
28930 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77   ** mode. Otherw
28940 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ise, the followi
28950 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ng function call
28960 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20   is a no-op..   
28970 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
28980 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
28990 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nt(pPager);.  }.
289a0 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
289b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
289c0 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e  .    /* pager_un
289d0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
289e0 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  p for exclusive 
289f0 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f  mode and in-memo
28a00 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ry databases. */
28a10 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
28a20 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
28a30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28a40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
28a50 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
28a60 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
28a70 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
28a80 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
28a90 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
28aa0 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
28ab0 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
28ac0 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
28ad0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
28ae0 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
28af0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
28b00 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
28b10 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
28b20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
28b30 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
28b40 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
28b50 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
28b60 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
28b70 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
28b80 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
28b90 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
28ba0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
28bb0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
28bc0 65 29 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70  e)==0).   && (!p
28bd0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
28be0 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
28bf0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20  journalOff>0) . 
28c00 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
28c10 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
28c20 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
28c30 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
28c40 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
28c50 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
28c60 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
28c70 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
28c80 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
28c90 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
28ca0 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
28cb0 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
28cc0 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
28cd0 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
28ce0 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
28cf0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
28d00 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
28d10 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
28d20 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
28d30 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
28d40 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
28d50 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
28d60 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
28d70 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
28d80 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
28d90 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
28da0 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
28db0 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
28dc0 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
28dd0 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
28de0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
28df0 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
28e00 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
28e10 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
28e20 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
28e30 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
28e40 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
28e50 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
28e60 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
28e70 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
28e80 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
28e90 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
28ea0 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
28eb0 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
28ec0 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
28ed0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
28ee0 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
28ef0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
28f00 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
28f10 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
28f20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
28f30 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
28f40 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
28f50 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
28f60 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
28f70 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
28f80 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
28f90 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
28fa0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
28fb0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
28fc0 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
28fd0 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
28fe0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
28ff0 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
29000 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
29010 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
29020 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
29030 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
29040 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
29050 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
29060 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
29070 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
29080 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
29090 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
290a0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
290b0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
290c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
290d0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
290e0 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
290f0 20 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72   seperate scenar
29100 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
29110 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
29120 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
29130 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
29140 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
29150 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
29160 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
29170 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
29180 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
29190 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
291a0 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
291b0 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
291c0 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
291d0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
291e0 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
291f0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  nal..**.** If no
29200 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
29210 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
29220 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
29230 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
29240 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
29250 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
29260 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
29270 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
29280 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
29290 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
292a0 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
292b0 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
292c0 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
292d0 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
292e0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
292f0 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
29300 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
29310 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
29320 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
29330 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
29340 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
29350 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
29360 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
29370 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
29380 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29390 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
293a0 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
293b0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
293c0 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
293d0 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
293e0 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
293f0 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
29400 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
29410 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
29420 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
29430 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
29440 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
29450 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
29460 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
29470 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
29480 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
29490 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
294a0 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
294b0 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
294c0 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
294d0 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
294e0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
294f0 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
29500 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
29510 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
29520 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
29530 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
29540 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
29550 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
29560 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
29570 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
29580 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
29590 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
295a0 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
295b0 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
295c0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
295d0 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
295e0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
295f0 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
29600 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
29610 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
29620 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
29630 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a  e3PagerAcquire(.
29640 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
29650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
29660 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
29670 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
29680 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
29690 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
296a0 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
296b0 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
296c0 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
296d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
296e0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
296f0 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20  int noContent   
29700 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
29710 74 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e  ther reading con
29720 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69  tent from disk i
29730 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
29740 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
29750 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
29760 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
29770 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
29780 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29790 73 74 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f  state>PAGER_UNLO
297a0 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  CK );..  if( pgn
297b0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
297c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
297d0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
297e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
297f0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
29800 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
29810 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
29820 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
29830 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
29840 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
29850 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
29860 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
29870 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
29880 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
29890 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
298a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
298b0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
298c0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
298d0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
298e0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
298f0 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61  e, pgno, 1, ppPa
29900 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ge);.  }..  if( 
29910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29920 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
29930 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
29940 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20  e3PcacheFetch() 
29950 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
29960 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
29970 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64  pager was alread
29980 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  y in the error-s
29990 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
299a0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
299b0 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70  ed..    ** Set p
299c0 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70  Pg to 0 and jump
299d0 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f   to the exceptio
299e0 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20  n handler.  */. 
299f0 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
29a00 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
29a10 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73  re_err;.  }.  as
29a20 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
29a30 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
29a40 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
29a50 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  e)->pPager==pPag
29a60 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  er || (*ppPage)-
29a70 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
29a80 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e   if( (*ppPage)->
29a90 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
29aa0 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
29ab0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
29ac0 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
29ad0 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
29ae0 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
29af0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
29b00 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
29b10 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
29b20 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
29b30 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
29b40 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
29b50 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
29b60 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
29b70 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
29b80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29b90 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b  TE_OK;..  }else{
29ba0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
29bb0 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
29bc0 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
29bd0 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
29be0 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
29bf0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f  initialized.  */
29c00 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a  .    int nMax;..
29c10 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
29c20 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
29c30 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
29c40 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
29c50 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
29c60 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
29c70 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
29c80 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
29c90 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
29ca0 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  page.    ** numb
29cb0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
29cc0 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75  this, or the unu
29cd0 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65  sed locking-page
29ce0 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20  , is requested. 
29cf0 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
29d00 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
29d10 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
29d20 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
29d30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
29d40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29d50 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
29d60 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
29d70 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73     }..    rc = s
29d80 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
29d90 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d  ount(pPager, &nM
29da0 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ax);.    if( rc!
29db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29dc0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
29dd0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
29de0 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  }..    if( MEMDB
29df0 20 7c 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67   || nMax<(int)pg
29e00 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
29e10 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
29e20 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
29e30 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
29e40 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
29e50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
29e60 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
29e70 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
29e80 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
29e90 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
29ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
29eb0 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
29ec0 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
29ed0 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
29ee0 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
29ef0 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
29f00 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
29f10 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
29f20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
29f30 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
29f40 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
29f50 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
29f60 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
29f70 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
29f80 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
29f90 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
29fa0 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
29fb0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
29fc0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
29fd0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
29fe0 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
29ff0 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
2a000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
2a010 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
2a020 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2a030 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
2a040 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
2a050 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
2a060 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
2a070 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
2a080 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
2a090 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2a0a0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
2a0b0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
2a0c0 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
2a0d0 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
2a0e0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2a0f0 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
2a100 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2a110 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
2a120 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
2a130 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2a140 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2a150 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
2a160 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
2a170 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2a180 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
2a190 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
2a1a0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
2a1b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a1c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2a1d0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2a1e0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
2a1f0 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
2a200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a210 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
2a220 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
2a230 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
2a240 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2a250 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
2a260 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
2a270 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
2a280 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
2a290 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2a2a0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
2a2b0 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
2a2c0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2a2d0 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
2a2e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
2a2f0 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
2a300 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
2a310 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
2a320 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
2a330 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
2a340 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
2a350 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
2a360 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
2a370 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
2a380 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
2a390 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
2a3a0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
2a3b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
2a3c0 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
2a3d0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
2a3e0 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72  n cache. Also, r
2a3f0 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a  eturn 0 if the .
2a400 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  ** pager is in P
2a410 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
2a420 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
2a430 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
2a440 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  ** or if the pag
2a450 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
2a460 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
2a470 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  an SQLITE_FULL..
2a480 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
2a490 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
2a4a0 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
2a4b0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
2a4c0 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
2a4d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2a4e0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
2a4f0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
2a500 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
2a510 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
2a520 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
2a530 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
2a540 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
2a550 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
2a560 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
2a570 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
2a580 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
2a590 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
2a5a0 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
2a5b0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
2a5c0 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
2a5d0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
2a5e0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
2a5f0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
2a600 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
2a610 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
2a620 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a630 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
2a640 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a650 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55  >state > PAGER_U
2a660 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  NLOCK );.  sqlit
2a670 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
2a680 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
2a690 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
2a6a0 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
2a6b0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
2a6c0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
2a6d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
2a6e0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
2a6f0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
2a700 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
2a710 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
2a720 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
2a730 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
2a740 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
2a750 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
2a760 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
2a770 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
2a780 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
2a790 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
2a7a0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
2a7b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2a7c0 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
2a7d0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
2a7e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2a7f0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2a800 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
2a810 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
2a820 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
2a830 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
2a840 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2a850 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2a860 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
2a870 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
2a880 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
2a890 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
2a8a0 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
2a8b0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
2a8c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2a8d0 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
2a8e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2a8f0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
2a900 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2a910 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
2a920 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
2a930 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
2a940 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
2a950 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
2a960 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
2a970 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
2a980 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
2a990 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
2a9a0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
2a9b0 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
2a9c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
2a9d0 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
2a9e0 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
2a9f0 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
2aa00 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
2aa10 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
2aa20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
2aa30 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
2aa40 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
2aa50 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
2aa60 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
2aa70 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
2aa80 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
2aa90 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
2aaa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
2aab0 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
2aac0 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
2aad0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
2aae0 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
2aaf0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
2ab00 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
2ab10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
2ab20 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
2ab30 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
2ab40 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
2ab50 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
2ab60 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
2ab70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
2ab80 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
2ab90 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2aba0 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
2abb0 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
2abc0 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
2abd0 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
2abe0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
2abf0 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
2ac00 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2ac10 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
2ac20 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
2ac30 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
2ac40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
2ac50 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
2ac60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2ac70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ac80 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aca0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2acb0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
2acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2ace0 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2acf0 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
2ad00 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2ad10 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2ad20 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
2ad30 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
2ad40 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
2ad50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2ad60 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2ad70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2ad80 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2ad90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2ada0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2adb0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2adc0 44 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65  DE_OFF );.  asse
2add0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
2ade0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
2adf0 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
2ae00 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
2ae10 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
2ae20 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
2ae30 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
2ae40 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
2ae50 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
2ae60 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
2ae70 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
2ae80 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
2ae90 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
2aea0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2aeb0 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
2aec0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74  r->errCode;..  t
2aed0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2aee0 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
2aef0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2af00 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
2af10 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2af20 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2af30 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
2af40 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
2af50 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
2af60 65 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(nPage);.  if( 
2af70 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2af80 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  al==0 ){.    ret
2af90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2afa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2afb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2afc0 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
2afd0 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
2afe0 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2aff0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2b000 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2b010 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2b020 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2b030 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ORY ){.      sql
2b040 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
2b050 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2b060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b070 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
2b080 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
2b090 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2b0a0 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
2b0b0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  al file */.     
2b0c0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
2b0d0 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2b0e0 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
2b0f0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
2b100 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
2b110 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2b120 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
2b130 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2b140 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
2b150 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
2b160 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
2b170 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66         );.#ifdef
2b180 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2b190 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2b1a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2b1b0 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
2b1c0 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
2b1d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
2b1e0 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
2b1f0 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
2b200 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b  pPager).      );
2b210 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
2b220 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2b230 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2b240 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
2b250 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
2b260 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
2b270 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
2b280 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
2b290 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2b2a0 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74  .  }...  /* Writ
2b2b0 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
2b2c0 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
2b2d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
2b2e0 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68  nd open .  ** th
2b2f0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
2b300 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
2b310 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
2b330 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
2b340 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
2b350 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
2b360 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
2b370 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
2b380 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2b390 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
2b3a0 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
2b3b0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2b3c0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2b3d0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
2b3e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2b3f0 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ff = 0;.    pPag
2b400 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
2b410 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
2b420 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
2b430 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
2b440 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
2b450 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
2b460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b470 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
2b480 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
2b490 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
2b4a0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2b4b0 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
2b4c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b4d0 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
2b4e0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2b4f0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2b500 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
2b510 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
2b520 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2b530 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
2b540 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2b550 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
2b560 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
2b570 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
2b580 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
2b590 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
2b5a0 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
2b5b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
2b5c0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
2b5d0 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
2b5e0 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
2b5f0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
2b600 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61  such a lock is a
2b610 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20  lready held, no 
2b620 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  locking .** func
2b630 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61  tions need be ca
2b640 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lled..**.** If t
2b650 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
2b660 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
2b670 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68  ory file and, th
2b680 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b690 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20  s .** opened if 
2b6a0 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  it has not been 
2b6b0 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74  already. For a t
2b6c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74  emporary file, t
2b6d0 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f  he opening .** o
2b6e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2b6f0 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
2b700 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
2b710 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20   actual need to 
2b720 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65  .** write to the
2b730 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20   journal. TODO: 
2b740 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f  Why handle tempo
2b750 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66 65  rary files diffe
2b760 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66  rently?.**.** If
2b770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b780 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20  e is opened (or 
2b790 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
2b7a0 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a   open), then a.*
2b7b0 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  * journal-header
2b7c0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
2b7d0 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a  he start of it..
2b7e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
2b7f0 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
2b800 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
2b810 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
2b820 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
2b830 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
2b840 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
2b850 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
2b860 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
2b870 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
2b880 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
2b890 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
2b8a0 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
2b8b0 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
2b8c0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
2b8d0 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
2b8e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
2b8f0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
2b900 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
2b910 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
2b920 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
2b930 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
2b940 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
2b950 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
2b960 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
2b970 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
2b980 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2b990 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
2b9a0 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
2b9b0 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
2b9c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2b9d0 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
2b9e0 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
2b9f0 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
2ba00 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
2ba10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
2ba20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2ba30 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
2ba40 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
2ba50 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
2ba60 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
2ba70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
2ba80 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
2ba90 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2baa0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
2bab0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
2bac0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
2bad0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2bae0 65 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  e );..    if( pa
2baf0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2bb00 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
2bb10 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
2bb20 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
2bb30 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
2bb40 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
2bb50 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
2bb60 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
2bb70 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
2bb80 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
2bb90 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
2bba0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
2bbb0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2bbc0 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
2bbd0 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
2bbe0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
2bbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2bc00 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
2bc10 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
2bc20 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
2bc30 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
2bc40 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
2bc50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2bc60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bc70 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2bc80 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
2bc90 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
2bca0 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
2bcb0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
2bcc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2bcd0 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
2bce0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
2bcf0 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
2bd00 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
2bd10 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
2bd20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
2bd30 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
2bd40 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
2bd50 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
2bd60 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
2bd70 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
2bd80 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
2bd90 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
2bda0 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
2bdb0 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
2bdc0 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
2bdd0 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
2bde0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
2bdf0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2be00 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
2be10 50 61 67 65 72 2e 73 74 61 74 65 20 74 6f 20 50  Pager.state to P
2be20 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 77 68  AGER_RESERVED wh
2be30 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
2be40 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  n.      ** trans
2be50 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65  action, but neve
2be60 72 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  r to PAGER_EXCLU
2be70 53 49 56 45 2e 20 54 68 69 73 20 69 73 20 62 65  SIVE. This is be
2be80 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
2be90 2a 2a 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ** PAGER_EXCLUSI
2bea0 56 45 20 73 74 61 74 65 20 74 68 65 20 63 6f 64  VE state the cod
2beb0 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
2bec0 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
2bed0 74 69 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6d  tions.      ** m
2bee0 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
2bef0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
2bf00 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
2bf10 61 73 65 20 66 69 6c 65 20 61 73 20 77 65 6c 6c  ase file as well
2bf20 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 6e 74  .      ** as int
2bf30 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
2bf40 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
2bf50 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 57 41   incorrect in WA
2bf60 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  L mode..      */
2bf70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2bf80 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
2bf90 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
2bfa0 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20  er->pWal);.     
2bfb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bfc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
2bfd0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2bfe0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2bff0 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
2c000 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2c010 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20  _RESERVED;.     
2c020 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2c030 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
2c040 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
2c050 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c060 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
2c070 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
2c080 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2c090 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c0a0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
2c0b0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
2c0c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c0d0 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
2c0e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
2c0f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c100 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
2c110 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
2c120 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
2c130 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
2c140 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
2c150 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2c160 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
2c170 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
2c180 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
2c190 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
2c1a0 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
2c1b0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
2c1c0 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
2c1d0 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
2c1e0 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
2c1f0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2c200 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
2c210 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
2c220 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
2c230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c240 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2c250 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2c260 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
2c270 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
2c280 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2c290 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
2c2a0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
2c2b0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
2c2c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2c2d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65   }..    /* No ne
2c2e0 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  ed to open the j
2c2f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
2c300 68 69 73 20 74 69 6d 65 2e 20 20 49 74 20 77 69  his time.  It wi
2c310 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65  ll be.    ** ope
2c320 6e 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73  ned before it is
2c330 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 49 66   written to.  If
2c340 20 77 65 20 64 65 66 65 72 20 6f 70 65 6e 69 6e   we defer openin
2c350 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20  g the journal,. 
2c360 20 20 20 2a 2a 20 77 65 20 6d 69 67 68 74 20 73     ** we might s
2c370 61 76 65 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  ave the work of 
2c380 63 72 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20  creating a file 
2c390 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2c3a0 6f 6e 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20 75  on.    ** ends u
2c3b0 70 20 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e  p being a no-op.
2c3c0 0a 20 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  .    */.  }else 
2c3d0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
2c3e0 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65  r->jfd) && pPage
2c3f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
2c400 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
2c410 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
2c420 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78   pager was in ex
2c430 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
2c440 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20  ode the last.   
2c450 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
2c460 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
2c470 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
2c480 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
2c490 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
2c4a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
2c4b0 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
2c4c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c4d0 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
2c4e0 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65   kept open and e
2c4f0 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61  ither was trunca
2c500 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f  ted to 0 bytes o
2c510 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73  r its header was
2c520 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74  .    ** overwrit
2c530 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ten with zeros..
2c540 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
2c550 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
2c560 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20  Pager)==0 );.   
2c570 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c580 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
2c590 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2c5a0 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
2c5b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2c5c0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
2c5d0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
2c5e0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
2c5f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
2c600 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
2c610 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
2c620 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2c630 29 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  )));.  if( rc!=S
2c640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c650 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
2c660 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20  >dbModified );. 
2c670 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79     /* Ignore any
2c680 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f   IO error that o
2c690 63 63 75 72 73 20 77 69 74 68 69 6e 20 70 61 67  ccurs within pag
2c6a0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2c6b0 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a  on(). The.    **
2c6c0 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73   purpose of this
2c6d0 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65 73 65   call is to rese
2c6e0 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
2c6f0 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
2c700 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73  r.    ** sub-sys
2c710 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20  tem. It doesn't 
2c720 6d 61 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f  matter if the jo
2c730 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
2c740 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a  t properly.    *
2c750 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74  * finalized at t
2c760 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65  his point (since
2c770 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c   it is not a val
2c780 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
2c790 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a  anyway)..    */.
2c7a0 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72      pager_end_tr
2c7b0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2c7c0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
2c7d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c7e0 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61  Mark a single da
2c7f0 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
2c800 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  able. The page i
2c810 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
2c820 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72  he .** main jour
2c830 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
2c840 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e 20  al as required. 
2c850 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  If the page is w
2c860 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f  ritten into.** o
2c870 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
2c880 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ls, the correspo
2c890 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
2c8a0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65   in the .** Page
2c8b0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
2c8c0 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67 65  vec and the Page
2c8d0 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
2c8e0 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a  vepoint bitvecs.
2c8f0 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73  ** of any open s
2c900 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70  avepoints as app
2c910 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61  ropriate..*/.sta
2c920 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
2c930 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
2c940 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d  .  void *pData =
2c950 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50   pPg->pData;.  P
2c960 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2c970 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
2c980 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c990 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
2c9a0 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c  tine is not call
2c9b0 65 64 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  ed unless a tran
2c9c0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
2c9d0 61 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74  ady been.  ** st
2c9e0 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  arted..  */.  as
2c9f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2ca00 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
2ca10 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
2ca20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  an error has bee
2ca30 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74  n previously det
2ca40 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68  ected, report th
2ca50 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a  e same error.  *
2ca60 2a 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  * again..  */.  
2ca70 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2ca80 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 20 72 65  ->errCode) )  re
2ca90 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
2caa0 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68  Code;..  /* High
2cab0 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er-level routine
2cac0 73 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69  s never call thi
2cad0 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61  s function if da
2cae0 74 61 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20  tabase is not.  
2caf0 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75  ** writable.  Bu
2cb00 74 20 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20  t check anyway, 
2cb10 6a 75 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e  just for robustn
2cb20 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ess. */.  if( NE
2cb30 56 45 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64  VER(pPager->read
2cb40 4f 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53  Only) ) return S
2cb50 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61  QLITE_PERM;..  a
2cb60 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
2cb70 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
2cb80 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
2cb90 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
2cba0 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
2cbb0 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
2cbc0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
2cbd0 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
2cbe0 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
2cbf0 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
2cc00 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73  t away..  */.  s
2cc10 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2cc20 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
2cc30 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
2cc40 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71  pPg) && !subjReq
2cc50 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2cc60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
2cc70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2cc80 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
2cc90 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
2cca0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
2ccb0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
2ccc0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
2ccd0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
2cce0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
2ccf0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2cd00 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
2cd10 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
2cd20 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
2cd30 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
2cd40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68    **.    ** High
2cd50 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65  er level routine
2cd60 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  s should have al
2cd70 72 65 61 64 79 20 73 74 61 72 74 65 64 20 61 20  ready started a 
2cd80 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20  transaction,.   
2cd90 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20   ** which means 
2cda0 74 68 65 79 20 68 61 76 65 20 61 63 71 75 69 72  they have acquir
2cdb0 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
2cdc0 20 6c 6f 63 6b 73 20 62 75 74 20 74 68 65 20 72   locks but the r
2cdd0 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a  ollback.    ** j
2cde0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
2cdf0 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   yet be open..  
2ce00 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2ce10 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
2ce20 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65  pPager, 0, pPage
2ce30 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  r->subjInMemory)
2ce40 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2ce50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ce60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ce70 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
2ce80 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 0a  ->pInJournal==0.
2ce90 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2cea0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2ceb0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2cec0 46 46 20 0a 20 20 20 20 20 26 26 20 21 70 61 67  FF .     && !pag
2ced0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2cee0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
2cef0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2cf00 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
2cf10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
2cf20 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
2cf30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2cf40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2cf50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2cf60 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
2cf70 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20  fied = 1;.  .   
2cf80 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
2cf90 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
2cfa0 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
2cfb0 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
2cfc0 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
2cfd0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
2cfe0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
2cff0 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
2d000 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
2d010 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
2d020 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
2d030 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
2d040 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
2d050 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
2d060 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
2d070 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2d080 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
2d090 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
2d0a0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
2d0b0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
2d0c0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
2d0d0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
2d0e0 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
2d0f0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
2d100 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
2d110 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
2d120 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
2d130 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
2d140 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2d150 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
2d160 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
2d170 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
2d180 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
2d190 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
2d1a0 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
2d1b0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
2d1c0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
2d1d0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
2d1e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d1f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
2d200 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  dr <= pPager->jo
2d210 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20  urnalOff );.    
2d220 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2d230 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2d240 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2d250 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61  QLITE_NOMEM, pDa
2d260 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  ta2);.        ck
2d270 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
2d280 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
2d290 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
2d2a0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
2d2b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
2d2c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d2d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2d2e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2d2f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d300 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d310 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2d320 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
2d330 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
2d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
2d360 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d370 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20   + 4);.         
2d380 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d390 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
2d3a0 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20  ageSize+4;.     
2d3b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2d3c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2d3e0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
2d3f0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
2d400 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b  ->journalOff, ck
2d410 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sum);.          
2d420 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d430 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ff += 4;.       
2d440 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
2d450 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
2d460 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
2d470 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
2d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d490 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d4a0 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
2d4b0 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
2d4c0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
2d4d0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
2d4e0 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
2d4f0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
2d500 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
2d510 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
2d520 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
2d530 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
2d540 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2d550 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
2d560 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
2d570 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2d580 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
2d590 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
2d5a0 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69         /* Even i
2d5b0 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66  f an IO or diskf
2d5c0 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ull error occurr
2d5d0 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c  ed while journal
2d5e0 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20  ling the.       
2d5f0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
2d600 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74  block above, set
2d610 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66   the need-sync f
2d620 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65  lag for the page
2d630 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68  ..        ** Oth
2d640 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65  erwise, when the
2d650 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2d660 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65  rolled back, the
2d670 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20   logic in.      
2d680 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e    ** playback_on
2d690 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68  e_page() will th
2d6a0 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  ink that the pag
2d6b0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  e needs to be re
2d6c0 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a  stored.        *
2d6d0 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
2d6e0 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61  e file. And if a
2d6f0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2d700 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  s while doing so
2d710 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2d720 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  n corruption may
2d730 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20   follow..       
2d740 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2d750 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
2d760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
2d770 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
2d780 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
2d790 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
2d7a0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2d7b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2d7c0 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  * An error has o
2d7d0 63 63 75 72 72 65 64 20 77 72 69 74 69 6e 67 20  ccurred writing 
2d7e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2d7f0 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
2d800 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
2d810 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
2d820 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
2d830 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
2d840 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2d850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d860 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2d870 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2d880 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2d890 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
2d8a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d8b0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
2d8c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2d8d0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
2d8e0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2d8f0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
2d900 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d910 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
2d920 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EM );.        as
2d930 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2d940 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
2d950 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
2d960 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61     rc |= addToSa
2d970 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
2d980 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2d990 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d9a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d9b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2d9c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
2d9d0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  EM );.          
2d9e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2d9f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2da00 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  {.        if( !p
2da10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
2da20 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
2da30 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
2da40 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
2da50 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
2da60 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70  YNC;.          p
2da70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
2da80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2da90 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
2daa0 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E(("APPEND %d pa
2dab0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
2dac0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2dad0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
2dae0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
2daf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2db00 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
2db10 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
2db20 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  :0)));.      }. 
2db30 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
2db40 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
2db50 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2db60 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
2db70 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
2db80 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
2db90 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
2dba0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
2dbb0 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
2dbc0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
2dbd0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2dbe0 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
2dbf0 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
2dc00 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
2dc10 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
2dc20 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
2dc30 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
2dc40 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
2dc50 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
2dc60 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
2dc70 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2dc80 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
2dc90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
2dca0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
2dcb0 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
2dcc0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
2dcd0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2dce0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
2dcf0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2dd00 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
2dd10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
2dd20 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
2dd30 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
2dd40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
2dd50 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
2dd60 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73   writeable. This
2dd70 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
2dd80 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a   called before .
2dd90 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ** making change
2dda0 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65  s to a page. The
2ddb0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65   caller must che
2ddc0 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ck the return va
2ddd0 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20  lue .** of this 
2dde0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20  function and be 
2ddf0 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63  careful not to c
2de00 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
2de10 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74  ata unless .** t
2de20 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2de30 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
2de40 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2de50 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2de60 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
2de70 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
2de80 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
2de90 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
2dea0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
2deb0 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
2dec0 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
2ded0 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
2dee0 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
2def0 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
2df00 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
2df10 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
2df20 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2df30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
2df40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2df50 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2df60 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
2df70 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65  NOMEM or an IO e
2df80 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2df90 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72  urned.** as appr
2dfa0 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69  opriate. Otherwi
2dfb0 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
2dfc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2dfd0 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
2dfe0 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
2dff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e000 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
2e010 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
2e020 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2e030 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
2e040 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
2e050 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
2e060 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
2e070 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50  Size);..  if( nP
2e080 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29  agePerSector>1 )
2e090 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  {.    Pgno nPage
2e0a0 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
2e0b0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2e0c0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2e0d0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
2e0e0 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20   Pgno pg1;      
2e0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2e100 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
2e110 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
2e120 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20  cated on. */.   
2e130 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
2e140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2e150 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
2e160 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f  arting at pg1 to
2e170 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
2e180 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2e190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2e1a0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
2e1b0 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
2e1c0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
2e1d0 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68  ue if any page h
2e1e0 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  as PGHDR_NEED_SY
2e1f0 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  NC */..    /* Se
2e200 74 20 74 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  t the doNotSpill
2e210 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
2e220 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
2e230 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
2e240 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
2e250 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
2e260 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
2e270 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
2e280 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2e290 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
2e2a0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
2e2b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e2c0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30 20 29  >doNotSpill==0 )
2e2d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
2e2e0 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20  NotSpill++;..   
2e2f0 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
2e300 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
2e310 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
2e320 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
2e330 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
2e340 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
2e350 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
2e360 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
2e370 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
2e380 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
2e390 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
2e3a0 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
2e3b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
2e3c0 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
2e3d0 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
2e3e0 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
2e3f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e400 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2e410 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
2e420 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69  ageCount);.    i
2e430 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2e440 63 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  c;.    if( pPg->
2e450 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
2e460 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
2e470 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
2e480 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
2e490 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
2e4a0 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
2e4b0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
2e4c0 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
2e4d0 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
2e4e0 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
2e4f0 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
2e500 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2e510 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
2e520 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
2e530 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
2e540 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
2e550 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
2e560 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
2e570 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
2e580 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
2e590 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
2e5a0 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
2e5b0 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
2e5c0 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  f( pg==pPg->pgno
2e5d0 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76   || !sqlite3Bitv
2e5e0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
2e5f0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29  InJournal, pg) )
2e600 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  {.        if( pg
2e610 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
2e620 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
2e630 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2e640 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
2e650 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
2e660 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
2e670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e680 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
2e690 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
2e6a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2e6b0 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
2e6c0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2e6d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2e6e0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
2e700 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
2e710 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
2e720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2e730 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2e740 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
2e750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2e760 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2e770 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   (pPage = pager_
2e780 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
2e790 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  g))!=0 ){.      
2e7a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
2e7b0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2e7c0 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
2e7d0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
2e7e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e7f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2e800 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
2e810 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2e820 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  If the PGHDR_NEE
2e830 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73  D_SYNC flag is s
2e840 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
2e850 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
2e860 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
2e870 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
2e880 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
2e890 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
2e8a0 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
2e8b0 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
2e8c0 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
2e8d0 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
2e8e0 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
2e8f0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
2e900 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
2e910 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
2e920 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
2e930 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
2e940 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
2e950 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
2e960 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2e970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2e980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2e990 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
2e9a0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
2e9b0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  B && pPager->noS
2e9c0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
2e9d0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
2e9e0 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
2e9f0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
2ea00 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
2ea10 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
2ea20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2ea30 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
2ea40 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
2ea50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
2ea60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ea70 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
2ea80 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2ea90 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2eaa0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
2eab0 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
2eac0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ead0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29  >doNotSpill==1 )
2eae0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
2eaf0 4e 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65  NotSpill--;.  }e
2eb00 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
2eb10 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
2eb20 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
2eb30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2eb40 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2eb50 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
2eb60 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
2eb70 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
2eb80 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
2eb90 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
2eba0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
2ebb0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
2ebc0 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
2ebd0 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
2ebe0 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
2ebf0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
2ec00 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
2ec10 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
2ec20 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
2ec30 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2ec40 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
2ec50 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
2ec60 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
2ec70 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
2ec80 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
2ec90 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
2eca0 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
2ecb0 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
2ecc0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
2ecd0 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
2ece0 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
2ecf0 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
2ed00 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
2ed10 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
2ed20 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
2ed30 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
2ed40 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
2ed50 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
2ed60 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
2ed70 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
2ed80 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
2ed90 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
2eda0 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
2edb0 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
2edc0 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
2edd0 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
2ede0 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
2edf0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
2ee00 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
2ee10 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
2ee20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
2ee30 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
2ee40 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
2ee50 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
2ee60 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75  ation can quadru
2ee70 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
2ee80 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54   large .** DELET
2ee90 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  E operations..*/
2eea0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
2eeb0 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64  erDontWrite(PgHd
2eec0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2eed0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2eee0 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70  pPager;.  if( (p
2eef0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2ef00 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
2ef10 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
2ef20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2ef30 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E(("DONT_WRITE p
2ef40 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
2ef50 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
2ef60 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2ef70 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
2ef80 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
2ef90 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
2efa0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
2efb0 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  |= PGHDR_DONT_WR
2efc0 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ITE;.#ifdef SQLI
2efd0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
2efe0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
2eff0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
2f000 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
2f010 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2f020 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2f030 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
2f040 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2f050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a   database file .
2f060 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
2f070 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34  r, stored as a 4
2f080 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2f090 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e   integer startin
2f0a0 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66  g at .** byte of
2f0b0 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70  fset 24 of the p
2f0c0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  ager file..**.**
2f0d0 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74   If the isDirect
2f0e0 4d 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72  Mode flag is zer
2f0f0 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
2f100 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
2f110 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2f120 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
2f130 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
2f140 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2f150 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
2f160 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
2f170 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
2f180 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
2f190 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
2f1a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
2f1b0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
2f1c0 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
2f1d0 6c 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  lag may only be 
2f1e0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2f1f0 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70  library was comp
2f200 69 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  iled.** with the
2f210 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2f220 54 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72  TOMIC_WRITE macr
2f230 6f 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68  o defined. In th
2f240 69 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69  is case,.** if i
2f250 73 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a  sDirect is non-z
2f260 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61  ero, then the da
2f270 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
2f280 70 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a  pdated directly.
2f290 2a 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e  ** by writing an
2f2a0 20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e   updated version
2f2b0 20 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67   of page 1 using
2f2c0 20 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a   a call to the .
2f2d0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  ** sqlite3OsWrit
2f2e0 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  e() function..*/
2f2f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2f300 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2f310 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
2f320 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
2f330 4d 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Mode){.  int rc 
2f340 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
2f350 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69  /* Declare and i
2f360 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61  nitialize consta
2f370 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69  nt integer 'isDi
2f380 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20  rect'. If the.  
2f390 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  ** atomic-write 
2f3a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2f3b0 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20  enabled in this 
2f3c0 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69  build, then isDi
2f3d0 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69  rect.  ** is ini
2f3e0 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
2f3f0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
2f400 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65  the isDirectMode
2f410 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20   parameter.  ** 
2f420 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2f430 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2f440 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  is always set to
2f450 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   zero..  **.  **
2f460 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61   The idea is tha
2f470 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  t if the atomic-
2f480 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2f490 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65  on is not.  ** e
2f4a0 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
2f4b0 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70  e time, the comp
2f4c0 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68  iler can omit th
2f4d0 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20  e tests of.  ** 
2f4e0 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77  'isDirect' below
2f4f0 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  , as well as the
2f500 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20   block enclosed 
2f510 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28  in the.  ** "if(
2f520 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e   isDirect )" con
2f530 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  dition..  */.#if
2f540 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
2f550 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2f560 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54 5f  # define DIRECT_
2f570 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74 28  MODE 0.  assert(
2f580 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30   isDirectMode==0
2f590 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
2f5a0 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d  AMETER(isDirectM
2f5b0 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65  ode);.#else.# de
2f5c0 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45  fine DIRECT_MODE
2f5d0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23 65   isDirectMode.#e
2f5e0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
2f5f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2f600 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
2f610 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
2f620 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2f630 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
2f640 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  e>0 ){.    PgHdr
2f650 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
2f660 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
2f670 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
2f680 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67  */.    u32 chang
2f690 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  e_counter;      
2f6a0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2f6b0 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d  value of change-
2f6c0 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f  counter field */
2f6d0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ..    assert( !p
2f6e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2f6f0 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2f700 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ->fd) );..    /*
2f710 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
2f720 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
2f730 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
2f740 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2f750 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
2f760 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  gHdr);.    asser
2f770 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20  t( pPgHdr==0 || 
2f780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2f790 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65  ..    /* If page
2f7a0 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64   one was fetched
2f7b0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61   successfully, a
2f7c0 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
2f7d0 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f   is not.    ** o
2f7e0 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65  perating in dire
2f7f0 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61  ct-mode, make pa
2f800 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20  ge 1 writable.  
2f810 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20  When not in .   
2f820 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   ** direct mode,
2f830 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61 79   page 1 is alway
2f840 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20  s held in cache 
2f850 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50 61  and hence the Pa
2f860 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20  gerGet().    ** 
2f870 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20  above is always 
2f880 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e  successful - hen
2f890 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e  ce the ALWAYS on
2f8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a   rc==SQLITE_OK..
2f8b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
2f8c0 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41  DIRECT_MODE && A
2f8d0 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45  LWAYS(rc==SQLITE
2f8e0 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  _OK) ){.      rc
2f8f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2f900 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
2f910 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
2f920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f930 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
2f940 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
2f950 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
2f960 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
2f970 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e  4. */.      chan
2f980 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
2f990 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
2f9a0 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
2f9b0 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61  Vers);.      cha
2f9c0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
2f9d0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2f9e0 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2f9f0 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
2fa00 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  _counter);..    
2fa10 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
2fa20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
2fa30 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
2fa40 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
2fa50 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2fa60 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65  92..95 store the
2fa70 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
2fa80 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65  for which the ve
2fa90 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 20  rsion number.   
2faa0 20 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20     ** is valid. 
2fab0 2a 2f 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  */.      put32bi
2fac0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
2fad0 72 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68  r->pData)+92, ch
2fae0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
2faf0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2fb00 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2fb10 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45  Data)+96, SQLITE
2fb20 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29  _VERSION_NUMBER)
2fb30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ;..      /* If r
2fb40 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74  unning in direct
2fb50 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65   mode, write the
2fb60 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
2fb70 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  e 1 to the file.
2fb80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49   */.      if( DI
2fb90 52 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20  RECT_MODE ){.   
2fba0 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
2fbb0 2a 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61  *zBuf;.        a
2fbc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
2fbd0 62 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20  bFileSize>0 );. 
2fbe0 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
2fbf0 61 67 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44  ager, pPgHdr->pD
2fc00 61 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51  ata, 1, 6, rc=SQ
2fc10 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66  LITE_NOMEM, zBuf
2fc20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2fc30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2fc40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2fc50 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
2fc60 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
2fc70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2fc80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
2fc90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2fca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fcb0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
2fcc0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2fcd0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2fce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fcf0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
2fd00 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
2fd10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2fd20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
2fd30 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
2fd40 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
2fd50 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
2fd60 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
2fd70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
2fd80 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  nc the pager fil
2fd90 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20  e to disk. This 
2fda0 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69  is a no-op for i
2fdb0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a  n-memory files.*
2fdc0 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20  * or pages with 
2fdd0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
2fde0 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
2fdf0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2fe00 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70  or called on a p
2fe10 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69  ager for which i
2fe20 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68  t is a no-op, th
2fe30 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
2fe40 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2fe50 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
2fe60 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2fe70 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2fe80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
2fe90 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
2fea0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2fed0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
2fee0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
2fef0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
2ff00 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
2ff10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2ff20 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
2ff30 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
2ff40 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
2ff50 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d  sync_flags);.  }
2ff60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ff70 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
2ff80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
2ff90 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
2ffa0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
2ffb0 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
2ffc0 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
2ffd0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
2ffe0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
2fff0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
30000 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
30010 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
30020 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
30030 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
30040 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
30050 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
30060 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
30070 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
30080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
30090 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ures that:.**.**
300a0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
300b0 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
300c0 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64  unter is updated
300d0 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75  ,.**   * the jou
300e0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28  rnal is synced (
300f0 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69  unless the atomi
30100 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
30110 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a  tion is used),.*
30120 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20  *   * all dirty 
30130 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
30140 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
30150 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20  e file, .**   * 
30160 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30170 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28  e is truncated (
30180 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e  if required), an
30190 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  d.**   * the dat
301a0 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
301b0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  d. .**.** The on
301c0 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65  ly thing that re
301d0 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
301e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
301f0 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a  is to finalize .
30200 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e  ** (delete, trun
30210 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
30220 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20   first part of) 
30230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30240 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20   (or .** delete 
30250 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
30260 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
30270 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
30280 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
30290 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
302a0 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
302b0 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
302c0 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
302d0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
302e0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
302f0 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  all..**.** If th
30300 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
30310 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20  r - noSync - is 
30320 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
30330 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
30340 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79  elf.** is not sy
30350 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  nced. The caller
30360 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
30370 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69  e3PagerSync() di
30380 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e  rectly to.** syn
30390 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
303a0 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
303b0 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  ng CommitPhaseTw
303c0 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68  o() to delete th
303d0 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
303e0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
303f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
30400 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
30410 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
30420 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
30430 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
30440 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
30450 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20  char *zMaster,  
30460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
30470 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61  not NULL, the ma
30480 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
30490 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e  e */.  int noSyn
304a0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
304b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
304c0 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63  o omit the xSync
304d0 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
304e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
304f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
30500 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30510 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
30520 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 69  The dbOrigSize i
30530 73 20 6e 65 76 65 72 20 73 65 74 20 69 66 20 6a  s never set if j
30540 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20  ournal_mode=OFF 
30550 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
30560 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
30570 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
30580 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65  ODE_OFF || pPage
30590 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30  r->dbOrigSize==0
305a0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70   );..  /* If a p
305b0 72 69 6f 72 20 65 72 72 6f 72 20 6f 63 63 75 72  rior error occur
305c0 72 65 64 2c 20 72 65 70 6f 72 74 20 74 68 61 74  red, report that
305d0 20 65 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f   error again. */
305e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
305f0 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20  rrCode ) return 
30600 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
30610 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
30620 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
30630 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
30640 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
30650 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
30660 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
30670 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
30680 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  e));..  if( MEMD
30690 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  B && pPager->dbM
306a0 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20 2f  odified ){.    /
306b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
306c0 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
306d0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
306e0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
306f0 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66  or this.    ** f
30700 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
30710 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
30720 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20   it is mostly a 
30730 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c  no-op.  However,
30740 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b   any.    ** back
30750 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e  up in progress n
30760 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61  eeds to be resta
30770 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
30780 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
30790 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
307a0 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20  ackup);.  }else 
307b0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
307c0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
307d0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
307e0 69 66 69 65 64 20 29 7b 0a 20 20 20 20 69 66 28  ified ){.    if(
307f0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
30800 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50 67  ger) ){.      Pg
30810 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  Hdr *pList = sql
30820 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
30830 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
30840 63 68 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  che);.      if( 
30850 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
30860 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
30870 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 4c 69  ames(pPager, pLi
30880 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  st, pPager->dbSi
30890 7a 65 2c 20 31 2c 20 0a 20 20 20 20 20 20 20 20  ze, 1, .        
308a0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 66 75 6c      (pPager->ful
308b0 6c 53 79 6e 63 20 3f 20 70 50 61 67 65 72 2d 3e  lSync ? pPager->
308c0 73 79 6e 63 5f 66 6c 61 67 73 20 3a 20 30 29 0a  sync_flags : 0).
308d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
308e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
308f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30900 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
30910 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
30920 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
30930 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
30940 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
30950 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70  llowing block up
30960 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
30970 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c  -counter. Exactl
30980 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20 20 2a  y how it.      *
30990 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65 70 65  * does this depe
309a0 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
309b0 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
309c0 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
309d0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 61  tion.      ** wa
309e0 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
309f0 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69  pile time, and i
30a00 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
30a10 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20  on meets the .  
30a20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63      ** runtime c
30a30 72 69 74 65 72 69 61 20 74 6f 20 75 73 65 20 74  riteria to use t
30a40 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20  he operation: . 
30a50 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
30a60 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73      * The file-s
30a70 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74  ystem supports t
30a80 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
30a90 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20  property for.   
30aa0 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b     **      block
30ab0 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73  s of size page-s
30ac0 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ize, and .      
30ad0 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d  **    * This com
30ae0 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
30af0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
30b00 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
30b10 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 45  .      **    * E
30b20 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
30b30 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
30b40 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
30b50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
30b60 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
30b70 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
30b80 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65  zation was not e
30b90 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
30ba0 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65  e time, then the
30bb0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
30bc0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
30bd0 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  er() function is
30be0 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74   called to updat
30bf0 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20  e the change.   
30c00 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e     ** counter in
30c10 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27   'indirect-mode'
30c20 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  . If the optimiz
30c30 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65  ation is compile
30c40 64 20 69 6e 20 62 75 74 0a 20 20 20 20 20 20 2a  d in but.      *
30c50 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61  * is not applica
30c60 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e  ble to this tran
30c70 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71  saction, call sq
30c80 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
30c90 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 6f  te().      ** to
30ca0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a   make sure the j
30cb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
30cc0 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72  actually been cr
30cd0 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c  eated, then call
30ce0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
30cf0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
30d00 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
30d10 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
30d20 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20  r in indirect.  
30d30 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20      ** mode. .  
30d40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
30d50 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
30d60 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
30d70 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61  s both enabled a
30d80 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20  nd applicable,. 
30d90 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c       ** then cal
30da0 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  l pager_incr_cha
30db0 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20  ngecounter() to 
30dc0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
30dd0 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 20 20  e-counter.      
30de0 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d  ** in 'direct' m
30df0 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
30e00 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
30e10 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  le will never be
30e20 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61 74 65  .      ** create
30e30 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73  d for this trans
30e40 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
30e50 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
30e60 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
30e70 52 49 54 45 0a 20 20 20 20 20 20 50 67 48 64 72  RITE.      PgHdr
30e80 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 61 73 73   *pPg;.      ass
30e90 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
30ea0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
30eb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
30ec0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
30ed0 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 20 20  DE_OFF );.      
30ee0 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20  if( !zMaster && 
30ef0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30f00 66 64 29 20 0a 20 20 20 20 20 20 20 26 26 20 70  fd) .       && p
30f10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
30f20 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  f==jrnlBufferSiz
30f30 65 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  e(pPager) .     
30f40 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53    && pPager->dbS
30f50 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize>=pPager->dbF
30f60 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 20 20 26  ileSize.       &
30f70 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c  & (0==(pPg = sql
30f80 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
30f90 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
30fa0 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d  che)) || 0==pPg-
30fb0 3e 70 44 69 72 74 79 29 0a 20 20 20 20 20 20 29  >pDirty).      )
30fc0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64  {.        /* Upd
30fd0 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ate the db file 
30fe0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76  change counter v
30ff0 69 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72  ia the direct-wr
31000 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20  ite method. The 
31010 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  .        ** foll
31020 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
31030 6d 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65  modify the in-me
31040 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
31050 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20  ion of page 1 . 
31060 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63         ** to inc
31070 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64  lude the updated
31080 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
31090 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70  and then write p
310a0 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a  age 1 .        *
310b0 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  * directly to th
310c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
310d0 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   Because of the 
310e0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20  atomic-write .  
310f0 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74        ** propert
31100 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69  y of the host fi
31110 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20  le-system, this 
31120 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 20  is safe..       
31130 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
31140 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
31150 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
31160 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
31170 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
31180 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
31190 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
311a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
311b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
311c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
311d0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
311e0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
311f0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
31200 20 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20      }.  #else.  
31210 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
31220 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
31230 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  r(pPager, 0);.  
31240 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
31250 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31260 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
31270 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a  se_one_exit;.  .
31280 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
31290 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
312a0 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
312b0 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
312c0 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
312d0 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
312e0 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
312f0 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
31300 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
31310 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69  rnal.      ** fi
31320 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  le. This can onl
31330 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  y happen in auto
31340 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20  -vacuum mode..  
31350 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
31360 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74  Before reading t
31370 68 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61  he pages with pa
31380 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65  ge numbers large
31390 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20  r than the .    
313a0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c    ** current val
313b0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
313c0 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62  ze, set dbSize b
313d0 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
313e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69  .      ** that i
313f0 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74  t took at the st
31400 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
31410 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  action. Otherwis
31420 65 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  e, the.      ** 
31430 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
31440 50 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72  PagerGet() retur
31450 6e 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69  n zeroed pages i
31460 6e 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 20  nstead of .     
31470 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61   ** reading data
31480 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
31490 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
314a0 2a 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  *.      ** When 
314b0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d 4f 46  journal_mode==OF
314c0 46 20 74 68 65 20 64 62 4f 72 69 67 53 69 7a 65  F the dbOrigSize
314d0 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2c   is always zero,
314e0 20 73 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a   so this.      *
314f0 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75  * block never ru
31500 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ns if journal_mo
31510 64 65 3d 4f 46 46 2e 0a 20 20 20 20 20 20 2a 2f  de=OFF..      */
31520 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .  #ifndef SQLIT
31530 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31540 4d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  M.      if( pPag
31550 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65  er->dbSize<pPage
31560 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
31570 20 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28        && ALWAYS(
31580 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
31590 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
315a0 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 20  ALMODE_OFF).    
315b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e    ){.        Pgn
315c0 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  o i;            
315d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315e0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
315f0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
31600 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e         const Pgn
31610 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  o iSkip = PAGER_
31620 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
31630 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b   /* Pending lock
31640 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
31650 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69   const Pgno dbSi
31660 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
31670 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  ize;       /* Da
31680 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a  tabase image siz
31690 65 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 70 50  e */ .        pP
316a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
316b0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
316c0 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e;.        for( 
316d0 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70  i=dbSize+1; i<=p
316e0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
316f0 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
31700 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
31710 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
31720 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69  r->pInJournal, i
31730 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
31740 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 67 48  .            PgH
31750 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  dr *pPage;      
31760 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
31770 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
31780 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31790 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
317a0 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
317b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
317c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
317d0 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
317e0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
317f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
31800 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31810 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
31820 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
31830 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
31840 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
31850 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
31860 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
31870 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
31880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31890 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
318a0 3e 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65  >dbSize = dbSize
318b0 3b 0a 20 20 20 20 20 20 7d 20 0a 20 20 23 65 6e  ;.      } .  #en
318c0 64 69 66 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20  dif.  .      /* 
318d0 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
318e0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
318f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
31900 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72  ile. If a master
31910 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
31920 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
31930 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
31940 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
31950 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20  rnal file, .    
31960 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74    ** or if zMast
31970 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d  er is NULL (no m
31980 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20  aster journal), 
31990 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69  then this call i
319a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 20  s a no-op..     
319b0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77   */.      rc = w
319c0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
319d0 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
319e0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
319f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
31a00 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
31a10 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20  one_exit;.  .   
31a20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
31a30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
31a40 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
31a50 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
31a60 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a  s being.      **
31a70 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c   used, this call
31a80 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65   will not create
31a90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31aa0 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79  e or perform any
31ab0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 6c 20 49  .      ** real I
31ac0 4f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  O..      */.    
31ad0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
31ae0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
31af0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31b00 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
31b10 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
31b20 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 57 72  ;.  .      /* Wr
31b30 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
31b40 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
31b50 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
31b60 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
31b70 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73 71 6c  ite_pagelist(sql
31b80 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
31b90 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
31ba0 63 68 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28  che));.      if(
31bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31bc0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31bd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
31be0 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  RR_BLOCKED );.  
31bf0 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69        goto commi
31c00 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
31c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31c20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
31c30 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
31c40 43 61 63 68 65 29 3b 0a 20 20 0a 20 20 20 20 20  Cache);.  .     
31c50 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
31c60 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74  on disk is not t
31c70 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
31c80 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
31c90 67 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ge,.      ** the
31ca0 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e  n use pager_trun
31cb0 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20  cate to grow or 
31cc0 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20  shrink the file 
31cd0 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
31ce0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
31cf0 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  >dbSize!=pPager-
31d00 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
31d10 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77         Pgno nNew
31d20 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
31d30 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53  e - (pPager->dbS
31d40 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  ize==PAGER_MJ_PG
31d50 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  NO(pPager));.   
31d60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
31d70 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
31d80 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  R_EXCLUSIVE );. 
31d90 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
31da0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
31db0 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, nNew);.      
31dc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31dd0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
31de0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
31df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20  ;.      }.  .   
31e00 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73     /* Finally, s
31e10 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
31e20 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
31e30 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
31e40 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29  ync && !noSync )
31e50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
31e60 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
31e70 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
31e80 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
31e90 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52      }.      IOTR
31ea0 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c  ACE(("DBSYNC %p\
31eb0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
31ec0 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
31ed0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
31ee0 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69  NCED;.  }..commi
31ef0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
31f00 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
31f10 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  .../*.** When th
31f20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
31f30 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62  alled, the datab
31f40 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
31f50 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20  n completely.** 
31f60 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
31f70 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d  ct the changes m
31f80 61 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65  ade by the curre
31f90 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  nt transaction a
31fa0 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20  nd.** synced to 
31fb0 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61  disk. The journa
31fc0 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69  l file still exi
31fd0 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  sts in the file-
31fe0 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67  system .** thoug
31ff0 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c  h, and if a fail
32000 75 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68  ure occurs at th
32010 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c  is point it will
32020 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62   eventually.** b
32030 65 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d  e used as a hot-
32040 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
32050 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
32060 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ion rolled back.
32070 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
32080 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74  tion finalizes t
32090 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
320a0 20 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74   either by delet
320b0 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74  ing, .** truncat
320c0 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79  ing or partially
320d0 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20   zeroing it, so 
320e0 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62  that it cannot b
320f0 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68  e used .** for h
32100 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
32110 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69  ack. Once this i
32120 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73  s done the trans
32130 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72  action is.** irr
32140 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74  evocably committ
32150 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
32160 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
32170 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
32180 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
32190 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65  he pager.** move
321a0 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  s into the error
321b0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
321c0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
321d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
321e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
321f0 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
32200 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
32210 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32230 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
32240 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
32250 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
32260 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ot be called if 
32270 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68 61  a prior error ha
32280 73 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a  s occurred..  **
32290 20 42 75 74 20 69 66 20 28 64 75 65 20 74 6f 20   But if (due to 
322a0 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 65  a coding error e
322b0 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  lsewhere in the 
322c0 73 79 73 74 65 6d 29 20 69 74 20 64 6f 65 73 20  system) it does 
322d0 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c  get.  ** called,
322e0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   just return the
322f0 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   same error code
32300 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
32310 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  nything. */.  if
32320 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
32330 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
32340 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
32350 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  e;..  /* This fu
32360 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
32370 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74  t be called if t
32380 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
32390 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a  in at least.  **
323a0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
323b0 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65  state. And indee
323c0 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64  d SQLite never d
323d0 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20 69 74  oes this. But it
323e0 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f   is.  ** nice to
323f0 20 68 61 76 65 20 74 68 69 73 20 64 65 66 65 6e   have this defen
32400 73 69 76 65 20 74 65 73 74 20 68 65 72 65 20 61  sive test here a
32410 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyway..  */.  if
32420 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
32430 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
32440 52 56 45 44 29 20 29 20 72 65 74 75 72 6e 20 53  RVED) ) return S
32450 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20  QLITE_ERROR;..  
32460 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69  /* An optimizati
32470 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61 62  on. If the datab
32480 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74 75  ase was not actu
32490 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64 75  ally modified du
324a0 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20 74  ring.  ** this t
324b0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20  ransaction, the 
324c0 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
324d0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
324e0 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75  de and is.  ** u
324f0 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74 20  sing persistent 
32500 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74  journals, then t
32510 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32520 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20  a no-op..  **.  
32530 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20  ** The start of 
32540 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32550 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61   currently conta
32560 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75  ins a single jou
32570 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65  rnal .  ** heade
32580 72 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20  r with the nRec 
32590 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e 20  field set to 0. 
325a0 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61  If such a journa
325b0 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20 20 2a  l is used as.  *
325c0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
325d0 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
325e0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63  al rollback, 0 c
325f0 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d  hanges will be m
32600 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ade.  ** to the 
32610 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 53  database file. S
32620 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
32630 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a  ed to zero the j
32640 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61  ournal .  ** hea
32650 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20 70  der. Since the p
32660 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
32670 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72 65  sive mode, there
32680 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a   is no need.  **
32690 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63   to drop any loc
326a0 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a  ks either..  */.
326b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
326c0 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20 70  Modified==0 && p
326d0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
326e0 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61 67  Mode .   && pPag
326f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
32700 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32710 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b 0a  DE_PERSIST.  ){.
32720 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32730 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
32740 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
32750 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 65  Pager) );.    re
32760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
32770 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
32780 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  E(("COMMIT %d\n"
32790 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
327a0 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  )));.  assert( p
327b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
327c0 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45  GER_SYNCED || ME
327d0 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  MDB || !pPager->
327e0 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20  dbModified );.  
327f0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
32800 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
32810 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
32820 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
32830 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
32840 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  er, rc);.}../*.*
32850 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
32860 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74 61  hanges. The data
32870 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
32880 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
32890 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  mode..**.** This
328a0 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
328b0 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a  ms two tasks:.**
328c0 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c 6c  .**   1) It roll
328d0 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  s back the journ
328e0 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72 69  al file, restori
328f0 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  ng all database 
32900 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20  file and .**    
32910 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68    in-memory cach
32920 65 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 73  e pages to the s
32930 74 61 74 65 20 74 68 65 79 20 77 65 72 65 20 69  tate they were i
32940 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  n when the trans
32950 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77  action.**      w
32960 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a  as opened, and.*
32970 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c 69  *   2) It finali
32980 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  zes the journal 
32990 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69 74  file, so that it
329a0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f 72   is not used for
329b0 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f 6c   hot.**      rol
329c0 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f 69  lback at any poi
329d0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
329e0 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74 20  ..**.** subject 
329f0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
32a00 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73 3a   qualifications:
32a10 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
32a20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
32a30 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68 65  not yet open whe
32a40 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32a50 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
32a60 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69 73  then only (2) is
32a70 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20 74   performed. In t
32a80 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
32a90 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s no journal fil
32aa0 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20 62  e.**   to roll b
32ab0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20  ack..**.** * If 
32ac0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
32ad0 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
32ae0 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20 74  ITE_FULL, then t
32af0 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20 20  ask (1) is .**  
32b00 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20 73   performed. If s
32b10 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b 20  uccessful, task 
32b20 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73 20  (2). Regardless 
32b30 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a 2a  of the outcome.*
32b40 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20 74  *   of either, t
32b50 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
32b60 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
32b70 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
32b80 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 65  ler.**   (i.e. e
32b90 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45  ither SQLITE_IOE
32ba0 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52  RR or SQLITE_COR
32bb0 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49  RUPT)..**.** * I
32bc0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
32bd0 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  n PAGER_RESERVED
32be0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74   state, then att
32bf0 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68 65  empt (1). Whethe
32c00 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28 31  r.**   or not (1
32c10 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  ) is successful,
32c20 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28 32   also attempt (2
32c30 29 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ). If successful
32c40 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53 51  , return.**   SQ
32c50 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
32c60 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65 72  se, enter the er
32c70 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
32c80 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 0a  turn the first .
32c90 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65 20  **   error code 
32ca0 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a 2a  encountered. .**
32cb0 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61  .**   In this ca
32cc0 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  se there is no c
32cd0 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 64  hance that the d
32ce0 61 74 61 62 61 73 65 20 77 61 73 20 77 72 69 74  atabase was writ
32cf0 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f  ten to. .**   So
32d00 20 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e 61   is safe to fina
32d10 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
32d20 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74 68   file even if th
32d30 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20 20  e playback .**  
32d40 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20 66   (operation 1) f
32d50 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20 74  ailed. However t
32d60 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 65 6e  he pager must en
32d70 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
32d80 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65 20  ate.**   as the 
32d90 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
32da0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
32db0 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74 2e  are now suspect.
32dc0 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79  .**.** * Finally
32dd0 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45 58  , if in PAGER_EX
32de0 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
32df0 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e  hen attempt (1).
32e00 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65 6d   Only.**   attem
32e10 70 74 20 28 32 29 20 69 66 20 28 31 29 20 69 73  pt (2) if (1) is
32e20 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65 74   successful. Ret
32e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
32e40 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
32e50 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74 65    otherwise ente
32e60 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
32e70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
32e80 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d   error code from
32e90 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c 69   the .**   faili
32ea0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  ng operation..**
32eb0 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63 61  .**   In this ca
32ec0 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  se the database 
32ed0 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  file may have be
32ee0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 53  en written to. S
32ef0 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70 6c  o if the.**   pl
32f00 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  ayback operation
32f10 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65 64   did not succeed
32f20 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65   it would not be
32f30 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a   safe to finaliz
32f40 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e  e.**   the journ
32f50 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65 64  al file. It need
32f60 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e 20  s to be left in 
32f70 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
32f80 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f 6d  so that.**   som
32f90 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
32fa0 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72 65  can use it to re
32fb0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
32fc0 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a 20  se state (by.** 
32fd0 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f    hot-journal ro
32fe0 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20  llback)..*/.int 
32ff0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
33000 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
33010 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
33020 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
33030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
33040 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
33050 50 41 47 45 52 54 52 41 43 45 28 28 22 52 4f 4c  PAGERTRACE(("ROL
33060 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
33070 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
33080 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
33090 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
330a0 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 72   int rc2;..    r
330b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
330c0 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
330d0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
330e0 42 41 43 4b 2c 20 2d 31 29 3b 0a 20 20 20 20 72  BACK, -1);.    r
330f0 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
33100 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
33110 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
33120 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ster);.    if( r
33130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
33140 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 72 63 20  c = rc2;.    rc 
33150 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
33160 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 65 6c  ager, rc);.  }el
33170 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
33180 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69  dbModified || !i
33190 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
331a0 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  d) ){.    rc = p
331b0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
331c0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
331d0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
331e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
331f0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
33200 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
33210 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
33220 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
33230 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
33240 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
33250 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
33260 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
33270 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
33280 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
33290 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
332a0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
332b0 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
332c0 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
332d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
332e0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
332f0 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70 61  ;.      rc2 = pa
33300 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
33310 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
33320 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
33330 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
33340 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33350 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
33360 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
33370 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
33380 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
33390 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
333a0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
333b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
333c0 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
333d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
333e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
333f0 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
33400 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
33410 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
33420 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  er.    ** cache.
33430 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
33440 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
33450 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
33460 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20  y error .    ** 
33470 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20  persistent..    
33480 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
33490 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
334a0 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
334b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
334c0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
334d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
334e0 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
334f0 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
33500 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
33510 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
33520 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
33530 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67 65  /.u8 sqlite3Page
33540 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
33550 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
33560 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
33570 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
33580 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
33590 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
335a0 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
335b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
335c0 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
335d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
335e0 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
335f0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
33600 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
33610 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
33620 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65  pproximate numbe
33630 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  r of bytes of me
33640 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 0a 2a  mory currently.*
33650 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 70 61  * used by the pa
33660 67 65 72 20 61 6e 64 20 69 74 73 20 61 73 73 6f  ger and its asso
33670 63 69 61 74 65 64 20 63 61 63 68 65 2e 0a 2a 2f  ciated cache..*/
33680 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
33690 72 4d 65 6d 55 73 65 64 28 50 61 67 65 72 20 2a  rMemUsed(Pager *
336a0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 70  pPager){.  int p
336b0 65 72 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  erPageSize = pPa
336c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
336d0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 2b  pPager->nExtra +
336e0 20 32 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 65   20;.  return pe
336f0 72 50 61 67 65 53 69 7a 65 2a 73 71 6c 69 74 65  rPageSize*sqlite
33700 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
33710 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
33720 29 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20 73  ).           + s
33730 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65  qlite3MallocSize
33740 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
33750 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
33760 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
33770 65 73 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  es to the specif
33780 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74  ied page..*/.int
33790 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
337a0 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67 65  eRefcount(DbPage
337b0 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
337c0 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
337d0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61  PageRefcount(pPa
337e0 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ge);.}..#ifdef S
337f0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
33800 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
33810 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
33820 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
33830 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
33840 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50  ite3PagerStats(P
33850 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
33860 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31   static int a[11
33870 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69  ];.  a[0] = sqli
33880 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
33890 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
338a0 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c  e);.  a[1] = sql
338b0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
338c0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
338d0 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73  che);.  a[2] = s
338e0 71 6c 69 74 65 33 50 63 61 63 68 65 47 65 74 43  qlite3PcacheGetC
338f0 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
33900 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33  >pPCache);.  a[3
33910 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
33920 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29 20  zeValid ? (int) 
33930 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a  pPager->dbSize :
33940 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50   -1;.  a[4] = pP
33950 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
33960 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
33970 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20  rCode;.  a[6] = 
33980 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
33990 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
339a0 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30  Miss;.  a[8] = 0
339b0 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65  ;  /* Used to be
339c0 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a   pPager->nOvfl *
339d0 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65  /.  a[9] = pPage
339e0 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30  r->nRead;.  a[10
339f0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69  ] = pPager->nWri
33a00 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  te;.  return a;.
33a10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
33a20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
33a30 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
33a40 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  ory pager..*/.in
33a50 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
33a60 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61  Memdb(Pager *pPa
33a70 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d  ger){.  return M
33a80 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  EMDB;.}../*.** C
33a90 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
33aa0 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61  are at least nSa
33ab0 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e  vepoint savepoin
33ac0 74 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65 72  ts open. If ther
33ad0 65 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e are.** current
33ae0 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53 61  ly less than nSa
33af0 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20 74  vepoints open, t
33b00 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72 20  hen open one or 
33b10 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 0a  more savepoints.
33b20 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74 68  ** to make up th
33b30 65 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49 66  e difference. If
33b40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
33b50 61 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c 72  avepoints is alr
33b60 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  eady.** equal to
33b70 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68 65   nSavepoint, the
33b80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
33b90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
33ba0 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
33bb0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
33bc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
33bd0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
33be0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
33bf0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74   while opening t
33c00 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
33c10 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20  ile, then an IO 
33c20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a  error code is.**
33c30 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
33c40 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
33c50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
33c60 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
33c70 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
33c80 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29   int nSavepoint)
33c90 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33ca0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
33cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33cc0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
33cd0 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20 3d    int nCurrent =
33ce0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
33cf0 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  int;        /* C
33d00 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
33d10 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a   savepoints */..
33d20 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74    if( nSavepoint
33d30 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50 61  >nCurrent && pPa
33d40 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
33d50 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  ){.    int ii;  
33d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d80 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
33d90 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67 65 72  ble */.    Pager
33da0 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b  Savepoint *aNew;
33db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33dc0 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 65 72 2e     /* New Pager.
33dd0 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79  aSavepoint array
33de0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
33df0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
33e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e10 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
33e20 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
33e30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33e40 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
33e50 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
33e60 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
33e70 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f   rc;..    /* Gro
33e80 77 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  w the Pager.aSav
33e90 65 70 6f 69 6e 74 20 61 72 72 61 79 20 75 73 69  epoint array usi
33ea0 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65  ng realloc(). Re
33eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
33ec0 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20  M.    ** if the 
33ed0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
33ee0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72  . Otherwise, zer
33ef0 6f 20 74 68 65 20 6e 65 77 20 70 6f 72 74 69 6f  o the new portio
33f00 6e 20 69 6e 20 63 61 73 65 20 61 20 0a 20 20 20  n in case a .   
33f10 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   ** malloc failu
33f20 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
33f30 70 6f 70 75 6c 61 74 69 6e 67 20 69 74 20 69 6e  populating it in
33f40 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f   the for(...) lo
33f50 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  op below..    */
33f60 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 50 61 67  .    aNew = (Pag
33f70 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 29 73 71  erSavepoint *)sq
33f80 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
33f90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
33fa0 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66  avepoint, sizeof
33fb0 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29  (PagerSavepoint)
33fc0 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20 20 20  *nSavepoint.    
33fd0 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77  );.    if( !aNew
33fe0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
33ff0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
34000 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
34010 26 61 4e 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c  &aNew[nCurrent],
34020 20 30 2c 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d   0, (nSavepoint-
34030 6e 43 75 72 72 65 6e 74 29 20 2a 20 73 69 7a 65  nCurrent) * size
34040 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  of(PagerSavepoin
34050 74 29 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  t));.    pPager-
34060 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e  >aSavepoint = aN
34070 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  ew;..    /* Popu
34080 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
34090 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
340a0 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
340b0 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  d. */.    for(ii
340c0 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53  =nCurrent; ii<nS
340d0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
340e0 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
340f0 6e 4f 72 69 67 20 3d 20 6e 50 61 67 65 3b 0a 20  nOrig = nPage;. 
34100 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
34110 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
34120 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
34130 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>0 ){.        
34140 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74  aNew[ii].iOffset
34150 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
34160 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  alOff;.      }el
34170 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77  se{.        aNew
34180 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a  [ii].iOffset = J
34190 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
341a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
341b0 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53       aNew[ii].iS
341c0 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  ubRec = pPager->
341d0 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61  nSubRec;.      a
341e0 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
341f0 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  oint = sqlite3Bi
34200 74 76 65 63 43 72 65 61 74 65 28 6e 50 61 67 65  tvecCreate(nPage
34210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e  );.      if( !aN
34220 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
34230 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  int ){.        r
34240 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
34250 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
34260 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
34270 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
34280 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 53       sqlite3WalS
34290 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2d  avepoint(pPager-
342a0 3e 70 57 61 6c 2c 20 61 4e 65 77 5b 69 69 5d 2e  >pWal, aNew[ii].
342b0 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 20  aWalData);.     
342c0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
342d0 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 69 69  >nSavepoint = ii
342e0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  +1;.    }.    as
342f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
34300 61 76 65 70 6f 69 6e 74 3d 3d 6e 53 61 76 65 70  avepoint==nSavep
34310 6f 69 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  oint );.    asse
34320 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
34330 61 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  aint(pPager);.  
34340 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
34350 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
34360 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
34370 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20   to rollback or 
34380 72 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29  release (commit)
34390 20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a   a savepoint..**
343a0 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74   The savepoint t
343b0 6f 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  o release or rol
343c0 6c 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20 62  lback need not b
343d0 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
343e0 74 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64 20  tly .** created 
343f0 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a  savepoint..**.**
34400 20 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73   Parameter op is
34410 20 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 53   always either S
34420 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
34430 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  K or SAVEPOINT_R
34440 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74  ELEASE..** If it
34450 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
34460 4c 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65  LEASE, then rele
34470 61 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20  ase and destroy 
34480 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69  the savepoint wi
34490 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76  th.** index iSav
344a0 65 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73  epoint. If it is
344b0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
344c0 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61  ACK, then rollba
344d0 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a  ck all changes.*
344e0 2a 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75  * that have occu
344f0 72 72 65 64 20 73 69 6e 63 65 20 74 68 65 20 73  rred since the s
34500 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69  pecified savepoi
34510 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  nt was created..
34520 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f  **.** The savepo
34530 69 6e 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  int to rollback 
34540 6f 72 20 72 65 6c 65 61 73 65 20 69 73 20 69 64  or release is id
34550 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
34560 6d 65 74 65 72 20 0a 2a 2a 20 69 53 61 76 65 70  meter .** iSavep
34570 6f 69 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f 66  oint. A value of
34580 20 30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65 72   0 means to oper
34590 61 74 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  ate on the outer
345a0 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a  most savepoint.*
345b0 2a 20 28 74 68 65 20 66 69 72 73 74 20 63 72 65  * (the first cre
345c0 61 74 65 64 29 2e 20 41 20 76 61 6c 75 65 20 6f  ated). A value o
345d0 66 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  f (Pager.nSavepo
345e0 69 6e 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70 65  int-1) means ope
345f0 72 61 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  rate.** on the m
34600 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65  ost recently cre
34610 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20  ated savepoint. 
34620 49 66 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  If iSavepoint is
34630 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
34640 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
34650 6e 74 2d 31 29 2c 20 74 68 65 6e 20 74 68 69 73  nt-1), then this
34660 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
34670 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
34680 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
34690 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
346a0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  s function, then
346b0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
346c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
346d0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
346e0 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 74 6f   is different to
346f0 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c   calling .** sql
34700 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
34710 6b 28 29 20 62 65 63 61 75 73 65 20 74 68 69 73  k() because this
34720 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
34730 6f 74 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20  ot terminate.** 
34740 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
34750 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  or unlock the da
34760 74 61 62 61 73 65 2c 20 69 74 20 6a 75 73 74 20  tabase, it just 
34770 72 65 73 74 6f 72 65 73 20 74 68 65 20 0a 2a 2a  restores the .**
34780 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
34790 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
347a0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e   original state.
347b0 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20 63   .**.** In any c
347c0 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69  ase, all savepoi
347d0 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65  nts with an inde
347e0 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69  x greater than i
347f0 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72  Savepoint .** ar
34800 65 20 64 65 73 74 72 6f 79 65 64 2e 20 49 66 20  e destroyed. If 
34810 74 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73  this is a releas
34820 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70 3d  e operation (op=
34830 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
34840 53 45 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61 76  SE),.** then sav
34850 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
34860 74 20 69 73 20 61 6c 73 6f 20 64 65 73 74 72 6f  t is also destro
34870 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  yed..**.** This 
34880 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
34890 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
348a0 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
348b0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
348c0 2a 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  * or an IO error
348d0 20 63 6f 64 65 20 69 66 20 61 6e 20 49 4f 20 65   code if an IO e
348e0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
348f0 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  e rolling back a
34900 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 20   .** savepoint. 
34910 49 66 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63 63  If no errors occ
34920 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
34930 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69   returned..*/ .i
34940 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
34950 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
34960 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20  pPager, int op, 
34970 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
34980 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
34990 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
349a0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
349b0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
349c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
349d0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
349e0 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
349f0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
34a00 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28  LLBACK );..  if(
34a10 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67   iSavepoint<pPag
34a20 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  er->nSavepoint )
34a30 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  {.    int ii;   
34a40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
34a50 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
34a60 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20  .    int nNew;  
34a70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34a80 72 20 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 73  r of remaining s
34a90 61 76 65 70 6f 69 6e 74 73 20 61 66 74 65 72 20  avepoints after 
34aa0 74 68 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20  this op. */..   
34ab0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
34ac0 6f 77 20 6d 61 6e 79 20 73 61 76 65 70 6f 69 6e  ow many savepoin
34ad0 74 73 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65  ts will still be
34ae0 20 61 63 74 69 76 65 20 61 66 74 65 72 20 74 68   active after th
34af0 69 73 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  is.    ** operat
34b00 69 6f 6e 2e 20 53 74 6f 72 65 20 74 68 69 73 20  ion. Store this 
34b10 76 61 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20 54  value in nNew. T
34b20 68 65 6e 20 66 72 65 65 20 72 65 73 6f 75 72 63  hen free resourc
34b30 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20  es associated . 
34b40 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 73     ** with any s
34b50 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 61  avepoints that a
34b60 72 65 20 64 65 73 74 72 6f 79 65 64 20 62 79 20  re destroyed by 
34b70 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
34b80 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77 20      */.    nNew 
34b90 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28  = iSavepoint + (
34ba0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
34bb0 52 45 4c 45 41 53 45 20 29 20 3f 20 30 20 3a 20  RELEASE ) ? 0 : 
34bc0 31 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e  1);.    for(ii=n
34bd0 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  New; ii<pPager->
34be0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
34bf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
34c00 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
34c10 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
34c20 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
34c30 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
34c40 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
34c50 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a   = nNew;..    /*
34c60 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65   If this is a re
34c70 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lease of the out
34c80 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74  ermost savepoint
34c90 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20  , truncate .    
34ca0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
34cb0 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  al to zero bytes
34cc0 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20   in size. */.   
34cd0 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
34ce0 4e 54 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20  NT_RELEASE ){.  
34cf0 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20      if( nNew==0 
34d00 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
34d10 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  ->sjfd) ){.     
34d20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 72 75 6e 63     /* Only trunc
34d30 61 74 65 20 69 66 20 69 74 20 69 73 20 61 6e 20  ate if it is an 
34d40 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
34d50 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
34d60 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d    if( sqlite3IsM
34d70 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
34d80 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  ->sjfd) ){.     
34d90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34da0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
34db0 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20  er->sjfd, 0);.  
34dc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34dd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
34de0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34df0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52     pPager->nSubR
34e00 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ec = 0;.      }.
34e10 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 6c 73      }.    /* Els
34e20 65 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  e this is a roll
34e30 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20  back operation, 
34e40 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70 65  playback the spe
34e50 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74  cified savepoint
34e60 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
34e70 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c   is a temp-file,
34e80 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
34e90 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
34ea0 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a   file has.    **
34eb0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
34ec0 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
34ed0 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62 65  se there have be
34ee0 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
34ef0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
34f00 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68  base file, so th
34f10 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61  e playback opera
34f20 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70  tion can be skip
34f30 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ped..    */.    
34f40 65 6c 73 65 20 69 66 28 20 70 61 67 65 72 55 73  else if( pagerUs
34f50 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20  eWal(pPager) || 
34f60 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
34f70 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67  fd) ){.      Pag
34f80 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
34f90 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d  vepoint = (nNew=
34fa0 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61  =0)?0:&pPager->a
34fb0 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31  Savepoint[nNew-1
34fc0 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ];.      rc = pa
34fd0 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
34fe0 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61  oint(pPager, pSa
34ff0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
35000 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54  assert(rc!=SQLIT
35010 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20  E_DONE);.    }. 
35020 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
35030 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
35040 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
35050 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
35060 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
35070 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
35080 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
35090 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
350a0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
350b0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
350c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
350d0 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  FS structure for
350e0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63   the pager..*/.c
350f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  onst sqlite3_vfs
35100 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66   *sqlite3PagerVf
35110 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
35120 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
35130 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->pVfs;.}../*.*
35140 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
35150 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
35160 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
35170 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
35180 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  h the pager.  Th
35190 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  is might return 
351a0 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65  NULL if the file
351b0 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   has.** not yet 
351c0 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  been opened..*/.
351d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71  sqlite3_file *sq
351e0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50  lite3PagerFile(P
351f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
35200 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
35210 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fd;.}../*.** Ret
35220 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
35230 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
35240 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
35250 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
35260 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
35270 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
35280 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
35290 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
352a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
352b0 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
352c0 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
352d0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
352e0 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
352f0 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
35300 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
35310 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
35320 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
35330 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
35340 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
35350 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
35360 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
35370 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72  C./*.** Set or r
35380 65 74 72 69 65 76 65 20 74 68 65 20 63 6f 64 65  etrieve the code
35390 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
353a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
353b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
353c0 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
353d0 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28  Pager,.  void *(
353e0 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
353f0 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
35400 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
35410 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
35420 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  nt,int),.  void 
35430 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f  (*xCodecFree)(vo
35440 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  id*),.  void *pC
35450 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50  odec.){.  if( pP
35460 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
35470 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
35480 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
35490 6f 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d  odec);.  pPager-
354a0 3e 78 43 6f 64 65 63 20 3d 20 70 50 61 67 65 72  >xCodec = pPager
354b0 2d 3e 6d 65 6d 44 62 20 3f 20 30 20 3a 20 78 43  ->memDb ? 0 : xC
354c0 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
354d0 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 3d  xCodecSizeChng =
354e0 20 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b   xCodecSizeChng;
354f0 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
35500 63 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46 72  cFree = xCodecFr
35510 65 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ee;.  pPager->pC
35520 6f 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20  odec = pCodec;. 
35530 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
35540 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74 61 74  (pPager);.}.stat
35550 69 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  ic void *sqlite3
35560 50 61 67 65 72 47 65 74 43 6f 64 65 63 28 50 61  PagerGetCodec(Pa
35570 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
35580 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
35590 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Codec;.}.#endif.
355a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
355b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
355c0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
355d0 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74  age pPg to locat
355e0 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
355f0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  file..**.** Ther
35600 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
35610 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
35620 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
35630 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e  ocated at.** pgn
35640 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c  o (which we call
35650 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20   pPgOld) though 
35660 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c  that page is all
35670 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e  owed to be.** in
35680 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20   cache.  If the 
35690 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
356a0 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20  located at pgno 
356b0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
356c0 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  * in the rollbac
356d0 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
356e0 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62   not put there b
356f0 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  y by this routin
35700 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  e..**.** Referen
35710 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
35720 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64  pPg remain valid
35730 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a  . Updating any.*
35740 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f  * meta-data asso
35750 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20  ciated with pPg 
35760 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
35770 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
35780 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
35790 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
357a0 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
357b0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
357c0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
357d0 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
357e0 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
357f0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
35800 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20  e is called. It 
35810 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65  used to be.** re
35820 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74  quired that a st
35830 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
35840 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69  ion was not acti
35850 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73  ve, but this res
35860 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  triction.** has 
35870 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52  been removed (CR
35880 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73  EATE INDEX needs
35890 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20   to move a page 
358a0 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
358b0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
358c0 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a  is active)..**.*
358d0 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20  * If the fourth 
358e0 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d  argument, isComm
358f0 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  it, is non-zero,
35900 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
35910 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65  is being.** move
35920 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64  d as part of a d
35930 61 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69  atabase reorgani
35940 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f  zation just befo
35950 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
35960 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20  on .** is being 
35970 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68  committed. In th
35980 69 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67  is case, it is g
35990 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
359a0 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
359b0 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20   .** pPg refers 
359c0 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77  to will not be w
359d0 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20  ritten to again 
359e0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
359f0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
35a00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
35a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
35a20 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
35a30 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
35a40 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
35a50 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 65  Otherwise, it re
35a60 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
35a70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
35a80 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67  agerMovepage(Pag
35a90 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61  er *pPager, DbPa
35aa0 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  ge *pPg, Pgno pg
35ab0 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  no, int isCommit
35ac0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f  ){.  PgHdr *pPgO
35ad0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
35ae0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65    /* The page be
35af0 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
35b00 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   */.  Pgno needS
35b10 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20  yncPgno = 0;    
35b20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20     /* Old value 
35b30 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66  of pPg->pgno, if
35b40 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
35b50 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  d */.  int rc;  
35b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
35b80 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69  de */.  Pgno ori
35b90 67 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  gPgno;          
35ba0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67       /* The orig
35bb0 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  inal page number
35bc0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
35bd0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
35be0 20 2f 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20   /* In order to 
35bf0 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  be able to rollb
35c00 61 63 6b 2c 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ack, an in-memor
35c10 79 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  y database must 
35c20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 74 68 65  journal.  ** the
35c30 20 70 61 67 65 20 77 65 20 61 72 65 20 6d 6f 76   page we are mov
35c40 69 6e 67 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20  ing from..  */. 
35c50 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
35c60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35c70 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
35c80 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
35c90 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
35ca0 20 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69   If the page bei
35cb0 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74  ng moved is dirt
35cc0 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65  y and has not be
35cd0 65 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20  en saved by the 
35ce0 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65  latest.  ** save
35cf0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65  point, then save
35d00 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
35d10 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
35d20 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a  e into the .  **
35d30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77   sub-journal now
35d40 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
35d50 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
35d60 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61   following scena
35d70 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rio:.  **.  **  
35d80 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20   BEGIN;.  **    
35d90 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
35da0 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74  , then modify it
35db0 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a   in memory>.  **
35dc0 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
35dd0 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  ne;.  **       <
35de0 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c  Move page X to l
35df0 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20  ocation Y>.  ** 
35e00 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
35e10 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  one;.  **.  ** I
35e20 66 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f  f page X were no
35e30 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
35e40 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72   sub-journal her
35e50 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
35e60 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
35e70 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20   to restore its 
35e80 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68  contents when th
35e90 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f  e "ROLLBACK TO o
35ea0 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ne".  ** stateme
35eb0 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f 63 65  nt were is proce
35ec0 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ssed..  **.  ** 
35ed0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29  subjournalPage()
35ee0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c   may need to all
35ef0 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20 73  ocate space to s
35f00 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69  tore pPg->pgno i
35f10 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20  nto.  ** one or 
35f20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62  more savepoint b
35f30 69 74 76 65 63 73 2e 20 54 68 69 73 20 69 73 20  itvecs. This is 
35f40 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20  the reason this 
35f50 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61  function.  ** ma
35f60 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
35f70 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66  NOMEM..  */.  if
35f80 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
35f90 44 52 5f 44 49 52 54 59 0a 20 20 20 26 26 20 73  DR_DIRTY.   && s
35fa0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
35fb0 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54  pPg).   && SQLIT
35fc0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a  E_OK!=(rc = subj
35fd0 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29  ournalPage(pPg))
35fe0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
35ff0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45   rc;.  }..  PAGE
36000 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64  RTRACE(("MOVE %d
36010 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
36020 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
36030 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
36040 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
36050 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e  Pg->pgno, (pPg->
36060 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
36070 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f  _SYNC)?1:0, pgno
36080 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
36090 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
360a0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
360b0 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f  gno, pgno))..  /
360c0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
360d0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
360e0 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67  c()ed before pag
360f0 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a  e pPg->pgno can.
36100 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
36110 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70  to, store pPg->p
36120 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  gno in local var
36130 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67  iable needSyncPg
36140 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  no..  **.  ** If
36150 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   the isCommit fl
36160 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65  ag is set, there
36170 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
36180 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a  emember that.  *
36190 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
361a0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
361b0 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
361c0 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e  se page pPg->pgn
361d0 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77  o .  ** can be w
361e0 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
361f0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
36200 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
36210 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20  o write to it.. 
36220 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e   */.  if( (pPg->
36230 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
36240 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d  _SYNC) && !isCom
36250 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  mit ){.    needS
36260 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
36270 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
36280 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
36290 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
362a0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
362b0 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
362c0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
362d0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20  HDR_DIRTY );.   
362e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
362f0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
36300 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
36310 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
36320 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
36330 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
36340 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
36350 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
36360 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
36370 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
36380 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
36390 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
363a0 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
363b0 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
363c0 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
363d0 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
363e0 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
363f0 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d  .  pPg->flags &=
36400 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e   ~PGHDR_NEED_SYN
36410 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  C;.  pPgOld = pa
36420 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
36430 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
36440 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70  rt( !pPgOld || p
36450 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29  PgOld->nRef==1 )
36460 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
36470 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  {.    pPg->flags
36480 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61   |= (pPgOld->fla
36490 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
364a0 4e 43 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  NC);.    if( MEM
364b0 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44  DB ){.      /* D
364c0 6f 20 6e 6f 74 20 64 69 73 63 61 72 64 20 70 61  o not discard pa
364d0 67 65 73 20 66 72 6f 6d 20 61 6e 20 69 6e 2d 6d  ges from an in-m
364e0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
364f0 69 6e 63 65 20 77 65 20 6d 69 67 68 74 0a 20 20  ince we might.  
36500 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 72      ** need to r
36510 6f 6c 6c 62 61 63 6b 20 6c 61 74 65 72 2e 20 20  ollback later.  
36520 4a 75 73 74 20 6d 6f 76 65 20 74 68 65 20 70 61  Just move the pa
36530 67 65 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61  ge out of the wa
36540 79 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  y. */.      asse
36550 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
36560 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20  zeValid );.     
36570 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f   sqlite3PcacheMo
36580 76 65 28 70 50 67 4f 6c 64 2c 20 70 50 61 67 65  ve(pPgOld, pPage
36590 72 2d 3e 64 62 53 69 7a 65 2b 31 29 3b 0a 20 20  r->dbSize+1);.  
365a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
365b0 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
365c0 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  (pPgOld);.    }.
365d0 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67 6e 6f 20    }..  origPgno 
365e0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73  = pPg->pgno;.  s
365f0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65  qlite3PcacheMove
36600 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 73  (pPg, pgno);.  s
36610 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
36620 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
36630 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
36640 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
36650 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
36660 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
36670 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
36680 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
36690 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
366a0 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
366b0 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
366c0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
366d0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
366e0 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
366f0 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
36700 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
36710 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
36720 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
36730 68 65 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a  he .    ** "is j
36740 6f 75 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63  ournaled" bitvec
36750 20 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73   flag has been s
36760 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74  et. This needs t
36770 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79  o be remedied by
36780 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20  .    ** loading 
36790 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
367a0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
367b0 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  d setting the Pg
367c0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20  Hdr.needSync .  
367d0 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a    ** flag..    *
367e0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
367f0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
36800 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
36810 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69  e page-cache fai
36820 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20  ls, (due.    ** 
36830 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  to a malloc() or
36840 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c   IO failure), cl
36850 65 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74  ear the bit in t
36860 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a  he pInJournal[].
36870 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74      ** array. Ot
36880 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
36890 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61  page is loaded a
368a0 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e  nd written again
368b0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   in.    ** this 
368c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
368d0 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74  may be written t
368e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
368f0 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ile before.    *
36900 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69  * it is synced i
36910 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
36920 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20  file. This way, 
36930 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e  it may end up in
36940 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
36950 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20  nal file twice, 
36960 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  but that is not 
36970 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a  a problem..    *
36980 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
36990 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63  ite3PagerGet() c
369a0 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68  all may cause th
369b0 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e  e journal to syn
369c0 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  c. So make.    *
369d0 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72  * sure the Pager
369e0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
369f0 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a  s set too..    *
36a00 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  /.    PgHdr *pPg
36a10 48 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Hdr;.    assert(
36a20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
36a30 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
36a40 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
36a50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
36a60 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20  no, &pPgHdr);.  
36a70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
36a90 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70   needSyncPgno<=p
36aa0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
36ab0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
36ac0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 54 6d  ert( pPager->pTm
36ad0 70 53 70 61 63 65 21 3d 30 20 29 3b 0a 20 20 20  pSpace!=0 );.   
36ae0 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
36af0 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  ecClear(pPager->
36b00 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64  pInJournal, need
36b10 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67 65 72  SyncPgno, pPager
36b20 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
36b30 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
36b40 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
36b50 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
36b60 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72  c = 1;.    asser
36b70 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  t( pPager->noSyn
36b80 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29  c==0 && !MEMDB )
36b90 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c  ;.    pPgHdr->fl
36ba0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
36bb0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69  D_SYNC;.    sqli
36bc0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
36bd0 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
36be0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
36bf0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
36c00 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 6e    /*.  ** For an
36c10 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
36c20 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ase, make sure t
36c30 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
36c40 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a 20   continues.  ** 
36c50 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61 73  to exist, in cas
36c60 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
36c70 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c 20  n needs to roll 
36c80 62 61 63 6b 2e 20 20 55 73 65 20 70 50 67 4f 6c  back.  Use pPgOl
36c90 64 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 6f 72  d.  ** as the or
36ca0 69 67 69 6e 61 6c 20 70 61 67 65 20 73 69 6e 63  iginal page sinc
36cb0 65 20 69 74 20 68 61 73 20 61 6c 72 65 61 64 79  e it has already
36cc0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2e   been allocated.
36cd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
36ce0 42 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  B ){.    sqlite3
36cf0 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c  PcacheMove(pPgOl
36d00 64 2c 20 6f 72 69 67 50 67 6e 6f 29 3b 0a 20 20  d, origPgno);.  
36d10 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36d20 72 65 66 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d  ref(pPgOld);.  }
36d30 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
36d40 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
36d50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
36d60 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
36d70 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
36d80 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
36d90 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
36da0 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
36db0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
36dc0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  pPg->nRef>0 || p
36dd0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44  Pg->pPager->memD
36de0 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  b );.  return pP
36df0 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a  g->pData;.}../*.
36e00 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
36e10 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
36e20 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
36e30 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
36e40 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
36e50 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
36e60 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
36e70 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
36e80 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
36e90 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
36ea0 20 70 50 67 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a   pPg->pExtra;.}.
36eb0 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
36ec0 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20  he locking-mode 
36ed0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
36ee0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
36ef0 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f  must be one.** o
36f00 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  f PAGER_LOCKINGM
36f10 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52  ODE_QUERY, PAGER
36f20 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
36f30 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52  MAL or .** PAGER
36f40 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
36f50 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20 70  LUSIVE. If the p
36f60 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
36f70 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20  _QUERY, then.** 
36f80 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
36f90 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
36fa0 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
36fb0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
36fc0 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74 68  ed value is eith
36fd0 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  er PAGER_LOCKING
36fe0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a  MODE_NORMAL or.*
36ff0 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
37000 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69  ODE_EXCLUSIVE, i
37010 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63 75  ndicating the cu
37020 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
37030 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b  updated).** lock
37040 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ing-mode..*/.int
37050 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
37060 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a  kingMode(Pager *
37070 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
37080 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
37090 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
370a0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  NGMODE_QUERY.   
370b0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
370c0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
370d0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  MODE_NORMAL.    
370e0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
370f0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
37100 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
37110 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
37120 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
37130 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  RY<0 );.  assert
37140 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
37150 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26  ODE_NORMAL>=0 &&
37160 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
37170 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20  DE_EXCLUSIVE>=0 
37180 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
37190 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  0 && !pPager->te
371a0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
371b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
371c0 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b  ode = (u8)eMode;
371d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
371e0 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  nt)pPager->exclu
371f0 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  siveMode;.}../*.
37200 2a 2a 20 53 65 74 20 74 68 65 20 6a 6f 75 72 6e  ** Set the journ
37210 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  al-mode for this
37220 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
37230 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
37240 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
37250 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
37260 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  DE_DELETE.**    
37270 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37280 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  E_TRUNCATE.**   
37290 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
372a0 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  DE_PERSIST.**   
372b0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
372c0 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47  DE_OFF.**    PAG
372d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
372e0 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 50 41 47 45  EMORY.**    PAGE
372f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
37300 4c 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  L.**.** The jour
37310 6e 61 6c 6d 6f 64 65 20 69 73 20 73 65 74 20 74  nalmode is set t
37320 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
37330 69 66 69 65 64 20 69 66 20 74 68 65 20 63 68 61  ified if the cha
37340 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e 0a  nge is allowed..
37350 2a 2a 20 54 68 65 20 63 68 61 6e 67 65 20 6d 61  ** The change ma
37360 79 20 62 65 20 64 69 73 61 6c 6c 6f 77 65 64 20  y be disallowed 
37370 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  for the followin
37380 67 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  g reasons:.**.**
37390 20 20 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f     *  An in-memo
373a0 72 79 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  ry database can 
373b0 6f 6e 6c 79 20 68 61 76 65 20 69 74 73 20 6a 6f  only have its jo
373c0 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74  urnal_mode set t
373d0 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f  o _OFF.**      o
373e0 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  r _MEMORY..**.**
373f0 20 20 20 2a 20 20 54 65 6d 70 6f 72 61 72 79 20     *  Temporary 
37400 64 61 74 61 62 61 73 65 73 20 63 61 6e 6e 6f 74  databases cannot
37410 20 68 61 76 65 20 5f 57 41 4c 20 6a 6f 75 72 6e   have _WAL journ
37420 61 6c 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  almode..**.** Th
37430 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63  e returned indic
37440 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ate the current 
37450 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
37460 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e  d) journal-mode.
37470 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
37480 61 67 65 72 53 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerSetJournalMo
37490 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
374a0 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
374b0 75 38 20 65 4f 6c 64 20 3d 20 70 50 61 67 65 72  u8 eOld = pPager
374c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  ->journalMode;  
374d0 20 20 2f 2a 20 50 72 69 6f 72 20 6a 6f 75 72 6e    /* Prior journ
374e0 61 6c 6d 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  almode */..  /* 
374f0 54 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  The eMode parame
37500 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  ter is always va
37510 6c 69 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  lid */.  assert(
37520 20 20 20 20 20 20 65 4d 6f 64 65 3d 3d 50 41 47        eMode==PAG
37530 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
37540 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 20  ELETE.          
37550 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
37560 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
37570 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20 20  UNCATE.         
37580 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
37590 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
375a0 45 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20  ERSIST.         
375b0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
375c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
375d0 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  FF .            
375e0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
375f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
37600 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
37610 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
37620 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
37630 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  );..  /* Do not 
37640 61 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61  allow the journa
37650 6c 6d 6f 64 65 20 6f 66 20 61 20 54 45 4d 50 20  lmode of a TEMP 
37660 64 61 74 61 62 61 73 65 20 74 6f 20 62 65 20 63  database to be c
37670 68 61 6e 67 65 64 20 74 6f 20 57 41 4c 0a 20 20  hanged to WAL.  
37680 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
37690 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 65 4d 6f  >tempFile && eMo
376a0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
376b0 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
376c0 20 61 73 73 65 72 74 28 20 65 4f 6c 64 21 3d 50   assert( eOld!=P
376d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
376e0 5f 57 41 4c 20 29 3b 0a 20 20 20 20 65 4d 6f 64  _WAL );.    eMod
376f0 65 20 3d 20 65 4f 6c 64 3b 0a 20 20 7d 0a 0a 20  e = eOld;.  }.. 
37700 20 2f 2a 20 44 6f 20 61 6c 6c 6f 77 20 74 68 65   /* Do allow the
37710 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65 20 6f 66 20   journalmode of 
37720 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
37730 61 62 61 73 65 20 74 6f 20 62 65 20 73 65 74 20  abase to be set 
37740 74 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67  to.  ** anything
37750 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 45 4d 4f   other than MEMO
37760 52 59 20 6f 72 20 4f 46 46 0a 20 20 2a 2f 0a 20  RY or OFF.  */. 
37770 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
37780 20 20 61 73 73 65 72 74 28 20 65 4f 6c 64 3d 3d    assert( eOld==
37790 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
377a0 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 65 4f 6c 64  E_MEMORY || eOld
377b0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
377c0 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69  ODE_OFF );.    i
377d0 66 28 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f  f( eMode!=PAGER_
377e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
377f0 52 59 20 26 26 20 65 4d 6f 64 65 21 3d 50 41 47  RY && eMode!=PAG
37800 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
37810 46 46 20 29 7b 0a 20 20 20 20 20 20 65 4d 6f 64  FF ){.      eMod
37820 65 20 3d 20 65 4f 6c 64 3b 0a 20 20 20 20 7d 0a  e = eOld;.    }.
37830 20 20 7d 0a 0a 20 20 69 66 28 20 65 4d 6f 64 65    }..  if( eMode
37840 21 3d 65 4f 6c 64 20 29 7b 0a 20 20 20 20 2f 2a  !=eOld ){.    /*
37850 20 57 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 62   When changing b
37860 65 74 77 65 65 6e 20 72 6f 6c 6c 62 61 63 6b 20  etween rollback 
37870 6d 6f 64 65 73 2c 20 63 6c 6f 73 65 20 74 68 65  modes, close the
37880 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 72   journal file pr
37890 69 6f 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ior.    ** to th
378a0 65 20 63 68 61 6e 67 65 2e 20 20 42 75 74 20 77  e change.  But w
378b0 68 65 6e 20 63 68 61 6e 67 69 6e 67 20 66 72 6f  hen changing fro
378c0 6d 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  m a rollback mod
378d0 65 20 74 6f 20 57 41 4c 2c 20 6b 65 65 70 0a 20  e to WAL, keep. 
378e0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
378f0 6c 20 6f 70 65 6e 20 73 69 6e 63 65 20 74 68 65  l open since the
37900 72 65 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  re is a rollback
37910 2d 73 74 79 6c 65 20 74 72 61 6e 73 61 63 74 69  -style transacti
37920 6f 6e 20 69 6e 20 70 6c 61 79 0a 20 20 20 20 2a  on in play.    *
37930 2a 20 75 73 65 64 20 74 6f 20 63 6f 6e 76 65 72  * used to conver
37940 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  t the version nu
37950 6d 62 65 72 73 20 69 6e 20 74 68 65 20 62 74 72  mbers in the btr
37960 65 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  ee header..    *
37970 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  /.    if( isOpen
37980 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
37990 20 65 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f   eMode!=PAGER_JO
379a0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
379b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
379c0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
379d0 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
379e0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6a 6f 75  * Change the jou
379f0 72 6e 61 6c 20 6d 6f 64 65 2e 20 2a 2f 0a 20 20  rnal mode. */.  
37a00 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
37a10 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  lMode = (u8)eMod
37a20 65 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  e;..    /* When 
37a30 74 72 61 6e 73 69 73 74 69 6f 6e 69 6e 67 20 66  transistioning f
37a40 72 6f 6d 20 54 52 55 4e 43 41 54 45 20 6f 72 20  rom TRUNCATE or 
37a50 50 45 52 53 49 53 54 20 74 6f 20 61 6e 79 20 6f  PERSIST to any o
37a60 74 68 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ther journal.   
37a70 20 2a 2a 20 6d 6f 64 65 20 65 78 63 65 70 74 20   ** mode except 
37a80 57 41 4c 20 28 61 6e 64 20 77 65 20 61 72 65 20  WAL (and we are 
37a90 6e 6f 74 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  not in locking_m
37aa0 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 29 20 74  ode=EXCLUSIVE) t
37ab0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 64 65 6c 65  hen .    ** dele
37ac0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
37ad0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
37ae0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
37af0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
37b00 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ATE & 5)==1 );. 
37b10 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
37b20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
37b30 52 53 49 53 54 20 26 20 35 29 3d 3d 31 20 29 3b  RSIST & 5)==1 );
37b40 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
37b50 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37b60 44 45 4c 45 54 45 20 26 20 35 29 3d 3d 30 20 29  DELETE & 5)==0 )
37b70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
37b80 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37b90 5f 4d 45 4d 4f 52 59 20 26 20 35 29 3d 3d 34 20  _MEMORY & 5)==4 
37ba0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
37bb0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37bc0 45 5f 4f 46 46 20 26 20 35 29 3d 3d 30 20 29 3b  E_OFF & 5)==0 );
37bd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
37be0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37bf0 57 41 4c 20 26 20 35 29 3d 3d 35 20 29 3b 0a 0a  WAL & 5)==5 );..
37c00 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
37c10 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
37c20 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  | pPager->exclus
37c30 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 69  iveMode );.    i
37c40 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
37c50 75 73 69 76 65 4d 6f 64 65 20 26 26 20 28 65 4f  usiveMode && (eO
37c60 6c 64 20 26 20 35 29 3d 3d 31 20 26 26 20 28 65  ld & 5)==1 && (e
37c70 4d 6f 64 65 20 26 20 31 29 3d 3d 30 20 29 7b 0a  Mode & 1)==0 ){.
37c80 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
37c90 73 20 63 61 73 65 20 77 65 20 77 6f 75 6c 64 20  s case we would 
37ca0 6c 69 6b 65 20 74 6f 20 64 65 6c 65 74 65 20 74  like to delete t
37cb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
37cc0 20 49 66 20 69 74 20 69 73 0a 20 20 20 20 20 20   If it is.      
37cd0 2a 2a 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c  ** not possible,
37ce0 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 6e 6f   then that is no
37cf0 74 20 61 20 70 72 6f 62 6c 65 6d 2e 20 44 65 6c  t a problem. Del
37d00 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eting the journa
37d10 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  l file.      ** 
37d20 68 65 72 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  here is an optim
37d30 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 20 20  ization only..  
37d40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
37d50 42 65 66 6f 72 65 20 64 65 6c 65 74 69 6e 67 20  Before deleting 
37d60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37d70 2c 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52  , obtain a RESER
37d80 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
37d90 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
37da0 65 20 66 69 6c 65 2e 20 54 68 69 73 20 65 6e 73  e file. This ens
37db0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
37dc0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
37dd0 74 20 64 65 6c 65 74 65 64 0a 20 20 20 20 20 20  t deleted.      
37de0 2a 2a 20 77 68 69 6c 65 20 69 74 20 69 73 20 69  ** while it is i
37df0 6e 20 75 73 65 20 62 79 20 73 6f 6d 65 20 6f 74  n use by some ot
37e00 68 65 72 20 63 6c 69 65 6e 74 2e 0a 20 20 20 20  her client..    
37e10 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72    */.      int r
37e20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
37e30 20 20 20 20 20 69 6e 74 20 73 74 61 74 65 20 3d       int state =
37e40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
37e50 20 20 20 20 20 20 69 66 28 20 73 74 61 74 65 3c        if( state<
37e60 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
37e70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
37e80 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
37e90 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
37ea0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
37eb0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
37ec0 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
37ed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
37ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
37ef0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
37f00 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
37f10 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
37f20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
37f30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37f40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37f50 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
37f60 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
37f70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
37f80 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
37f90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37fa0 45 5f 4f 4b 20 26 26 20 73 74 61 74 65 3d 3d 50  E_OK && state==P
37fb0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
37fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
37fd0 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
37fe0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
37ff0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
38000 20 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e   state==PAGER_UN
38010 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
38020 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
38030 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
38040 20 20 20 20 61 73 73 65 72 74 28 20 73 74 61 74      assert( stat
38050 65 3d 3d 70 50 61 67 65 72 2d 3e 73 74 61 74 65  e==pPager->state
38060 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
38070 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   /* Return the n
38080 65 77 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  ew journal mode 
38090 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74  */.  return (int
380a0 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  )pPager->journal
380b0 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Mode;.}../*.** R
380c0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
380d0 74 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 0a  t journal mode..
380e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
380f0 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64  gerGetJournalMod
38100 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
38110 7b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  {.  return (int)
38120 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
38130 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ode;.}../*.** Re
38140 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
38150 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 20 73   pager is in a s
38160 74 61 74 65 20 77 68 65 72 65 20 69 74 20 69 73  tate where it is
38170 20 4f 4b 20 74 6f 20 63 68 61 6e 67 65 20 74 68   OK to change th
38180 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 6d 6f 64 65  e.** journalmode
38190 2e 20 20 4a 6f 75 72 6e 61 6c 6d 6f 64 65 20 63  .  Journalmode c
381a0 68 61 6e 67 65 73 20 63 61 6e 20 6f 6e 6c 79 20  hanges can only 
381b0 68 61 70 70 65 6e 20 77 68 65 6e 20 74 68 65 20  happen when the 
381c0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 75  database.** is u
381d0 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e  nmodified..*/.in
381e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 6b  t sqlite3PagerOk
381f0 54 6f 43 68 61 6e 67 65 4a 6f 75 72 6e 61 6c 4d  ToChangeJournalM
38200 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
38210 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
38220 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 20 72  ->dbModified ) r
38230 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 69  eturn 0;.  if( i
38240 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
38250 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
38260 75 72 6e 61 6c 4f 66 66 3e 30 20 29 20 72 65 74  urnalOff>0 ) ret
38270 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
38280 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  1;.}../*.** Get/
38290 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d  set the size-lim
382a0 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73  it used for pers
382b0 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
382c0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74 74  iles..**.** Sett
382d0 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69 6d  ing the size lim
382e0 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20 6e  it to -1 means n
382f0 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f 72  o limit is enfor
38300 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65 6d  ced..** An attem
38310 70 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d 69  pt to set a limi
38320 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d  t smaller than -
38330 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  1 is a no-op..*/
38340 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65  .i64 sqlite3Page
38350 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  rJournalSizeLimi
38360 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
38370 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20   i64 iLimit){.  
38380 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29  if( iLimit>=-1 )
38390 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
383a0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
383b0 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72   iLimit;.  }.  r
383c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  eturn pPager->jo
383d0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a  urnalSizeLimit;.
383e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
383f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
38400 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
38410 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 62   variable. The b
38420 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20  ackup module.** 
38430 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e  in backup.c main
38440 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e  tains the conten
38450 74 20 6f 66 20 74 68 69 73 20 76 61 72 69 61 62  t of this variab
38460 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a  le. This module.
38470 2a 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71 75  ** uses it opaqu
38480 65 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d 65  ely as an argume
38490 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61 63  nt to sqlite3Bac
384a0 6b 75 70 52 65 73 74 61 72 74 28 29 20 61 6e 64  kupRestart() and
384b0 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75  .** sqlite3Backu
384c0 70 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a  pUpdate() only..
384d0 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  */.sqlite3_backu
384e0 70 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72  p **sqlite3Pager
384f0 42 61 63 6b 75 70 50 74 72 28 50 61 67 65 72 20  BackupPtr(Pager 
38500 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
38510 72 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63  rn &pPager->pBac
38520 6b 75 70 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  kup;.}..#ifndef 
38530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
38540 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38550 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
38560 65 6e 20 74 68 65 20 75 73 65 72 20 69 6e 76 6f  en the user invo
38570 6b 65 73 20 22 50 52 41 47 4d 41 20 63 68 65 63  kes "PRAGMA chec
38580 6b 70 6f 69 6e 74 22 2e 0a 2a 2f 0a 69 6e 74 20  kpoint"..*/.int 
38590 73 71 6c 69 74 65 33 50 61 67 65 72 43 68 65 63  sqlite3PagerChec
385a0 6b 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  kpoint(Pager *pP
385b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
385c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
385d0 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  f( pPager->pWal 
385e0 29 7b 0a 20 20 20 20 75 38 20 2a 7a 42 75 66 20  ){.    u8 *zBuf 
385f0 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
38600 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
38610 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 43 68  c = sqlite3WalCh
38620 65 63 6b 70 6f 69 6e 74 28 70 50 61 67 65 72 2d  eckpoint(pPager-
38630 3e 70 57 61 6c 2c 0a 20 20 20 20 20 20 20 20 28  >pWal,.        (
38640 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
38650 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79 6e   0 : pPager->syn
38660 63 5f 66 6c 61 67 73 29 2c 0a 20 20 20 20 20 20  c_flags),.      
38670 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
38680 7a 65 2c 20 7a 42 75 66 0a 20 20 20 20 29 3b 0a  ze, zBuf.    );.
38690 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
386a0 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .}..int sqlite3P
386b0 61 67 65 72 57 61 6c 43 61 6c 6c 62 61 63 6b 28  agerWalCallback(
386c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
386d0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
386e0 57 61 6c 43 61 6c 6c 62 61 63 6b 28 70 50 61 67  WalCallback(pPag
386f0 65 72 2d 3e 70 57 61 6c 29 3b 0a 7d 0a 0a 2f 2a  er->pWal);.}../*
38700 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
38710 69 66 20 74 68 65 20 75 6e