/ Hex Artifact Content
Login

Artifact f28399255953e789f6e10f2ac378aaeacd07be54:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 33 38 37 20 32 30 30 37 2f 30  c,v 1.387 2007/0
0190: 35 2f 32 34 20 30 37 3a 34 37 3a 30 37 20 64 61  5/24 07:47:07 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20  ./*.** Set this 
0340: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0350: 74 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74  to 1 to enable t
0360: 72 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65  racing using the
0370: 20 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e   TRACE.** macro.
0380: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
0390: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
03a0: 62 74 72 65 65 5f 74 72 61 63 65 3d 30 3b 20 20  btree_trace=0;  
03b0: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
03c0: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 65 6e  e tracing */.#en
03d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  dif../*.** Forwa
03e0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
03f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
0400: 63 6b 52 65 61 64 4c 6f 63 6b 73 28 42 74 72 65  ckReadLocks(Btre
0410: 65 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72  e*,Pgno,BtCursor
0420: 2a 29 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  *);...#ifdef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  CACHE.  /*.  ** 
0450: 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75  The functions qu
0460: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 20  eryTableLock(), 
0470: 6c 6f 63 6b 54 61 62 6c 65 28 29 20 61 6e 64 20  lockTable() and 
0480: 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
0490: 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74  ).  ** manipulat
04a0: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
04b0: 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20   BtShared.pLock 
04c0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75 73 65 64  linked list used
04d0: 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73   to store.  ** s
04e0: 68 61 72 65 64 2d 63 61 63 68 65 20 74 61 62 6c  hared-cache tabl
04f0: 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49  e level locks. I
0500: 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73  f the library is
0510: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74   compiled with t
0520: 68 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63  he.  ** shared-c
0530: 61 63 68 65 20 66 65 61 74 75 72 65 20 64 69 73  ache feature dis
0540: 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72  abled, then ther
0550: 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f  e is only ever o
0560: 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20  ne user.  ** of 
0570: 65 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74  each BtShared st
0580: 72 75 63 74 75 72 65 20 61 6e 64 20 73 6f 20 74  ructure and so t
0590: 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e  his locking is n
05a0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 20  ot necessary. . 
05b0: 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20 74 68   ** So define th
05c0: 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65 64 20 66  e lock related f
05d0: 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f  unctions as no-o
05e0: 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69  ps..  */.  #defi
05f0: 6e 65 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ne queryTableLoc
0600: 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  k(a,b,c) SQLITE_
0610: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 6c 6f 63  OK.  #define loc
0620: 6b 54 61 62 6c 65 28 61 2c 62 2c 63 29 20 53 51  kTable(a,b,c) SQ
0630: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
0640: 65 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65  e unlockAllTable
0650: 73 28 61 29 0a 23 65 6c 73 65 0a 0a 2f 2a 0a 2a  s(a).#else../*.*
0660: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
0670: 66 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20 70  f btree handle p
0680: 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f   may obtain a lo
0690: 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b  ck of type eLock
06a0: 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20   .** (READ_LOCK 
06b0: 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f  or WRITE_LOCK) o
06c0: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
06d0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e   root-page iTab.
06e0: 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   Return.** SQLIT
06f0: 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b  E_OK if the lock
0700: 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
0710: 20 28 62 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63   (by calling loc
0720: 6b 54 61 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a  kTable()), or.**
0730: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
0740: 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
0750: 20 69 6e 74 20 71 75 65 72 79 54 61 62 6c 65 4c   int queryTableL
0760: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
0770: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
0780: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
0790: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
07a0: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
07b0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
07c0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
07d0: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
07e0: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
07f0: 20 30 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61   0==sqlite3Threa
0800: 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 2d  dDataReadOnly()-
0810: 3e 75 73 65 53 68 61 72 65 64 44 61 74 61 20 29  >useSharedData )
0820: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
0830: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
0840: 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67 20 77 69  * This (along wi
0850: 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20  th lockTable()) 
0860: 69 73 20 77 68 65 72 65 20 74 68 65 20 52 65 61  is where the Rea
0870: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0880: 67 20 69 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20  g is.  ** dealt 
0890: 77 69 74 68 2e 20 49 66 20 74 68 65 20 63 61 6c  with. If the cal
08a0: 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e 67 20  ler is querying 
08b0: 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  for a read-lock 
08c0: 61 6e 64 20 74 68 65 20 66 6c 61 67 20 69 73 0a  and the flag is.
08d0: 20 20 2a 2a 20 73 65 74 2c 20 69 74 20 69 73 20    ** set, it is 
08e0: 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20  unconditionally 
08f0: 67 72 61 6e 74 65 64 20 2d 20 65 76 65 6e 20 69  granted - even i
0900: 66 20 74 68 65 72 65 20 61 72 65 20 77 72 69 74  f there are writ
0910: 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20  e-locks.  ** on 
0920: 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61 20  the table. If a 
0930: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65  write-lock is re
0940: 71 75 65 73 74 65 64 2c 20 74 68 65 20 52 65 61  quested, the Rea
0950: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0960: 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  g.  ** is not co
0970: 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20  nsidered..  **. 
0980: 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20   ** In function 
0990: 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20 69 66 20  lockTable(), if 
09a0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64  a read-lock is d
09b0: 65 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20  emanded and the 
09c0: 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d  .  ** ReadUncomm
09d0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
09e0: 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61  t, no entry is a
09f0: 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b  dded to the lock
0a00: 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74  s list .  ** (Bt
0a10: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20  Shared.pLock).. 
0a20: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d   **.  ** To summ
0a30: 61 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65  arize: If the Re
0a40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  adUncommitted fl
0a50: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
0a60: 72 65 61 64 20 63 75 72 73 6f 72 73 20 64 6f 0a  read cursors do.
0a70: 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61 74 65 20    ** not create 
0a80: 6f 72 20 72 65 73 70 65 63 74 20 74 61 62 6c 65  or respect table
0a90: 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b   locks. The lock
0aa0: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 66 6f  ing procedure fo
0ab0: 72 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d  r a .  ** write-
0ac0: 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20  cursor does not 
0ad0: 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
0ae0: 66 28 20 0a 20 20 20 20 21 70 2d 3e 70 53 71 6c  f( .    !p->pSql
0af0: 69 74 65 20 7c 7c 20 0a 20 20 20 20 30 3d 3d 28  ite || .    0==(
0b00: 70 2d 3e 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67  p->pSqlite->flag
0b10: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
0b20: 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20  ommitted) || .  
0b30: 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c    eLock==WRITE_L
0b40: 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d  OCK ||.    iTab=
0b50: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
0b60: 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  {.    for(pIter=
0b70: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
0b80: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
0b90: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
0ba0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
0bb0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
0bc0: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20  ble==iTab && .  
0bd0: 20 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e          (pIter->
0be0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20  eLock!=eLock || 
0bf0: 65 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b  eLock!=READ_LOCK
0c00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
0c10: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
0c20: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
0c30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
0c40: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
0c50: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
0c60: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
0c70: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
0c80: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
0c90: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
0ca0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
0cb0: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
0cc0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
0cd0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
0ce0: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
0cf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
0d00: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f  turned if the lo
0d10: 63 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63  ck is added succ
0d20: 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45  essfully. SQLITE
0d30: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c  _BUSY and.** SQL
0d40: 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c  ITE_NOMEM may al
0d50: 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  so be returned..
0d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
0d70: 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
0d80: 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75  , Pgno iTable, u
0d90: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
0da0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
0db0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  Bt;.  BtLock *pL
0dc0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  ock = 0;.  BtLoc
0dd0: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 2f 2a 20  k *pIter;..  /* 
0de0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
0df0: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
0e00: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
0e10: 65 64 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  ed */.  if( 0==s
0e20: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
0e30: 52 65 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53  ReadOnly()->useS
0e40: 68 61 72 65 64 44 61 74 61 20 29 7b 0a 20 20 20  haredData ){.   
0e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
0e60: 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  K;.  }..  assert
0e70: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65  ( SQLITE_OK==que
0e80: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  ryTableLock(p, i
0e90: 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b  Table, eLock) );
0ea0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65  ..  /* If the re
0eb0: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
0ec0: 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 61  lag is set and a
0ed0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65   read-lock is re
0ee0: 71 75 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65  quested,.  ** re
0ef0: 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f  turn early witho
0f00: 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74  ut adding an ent
0f10: 72 79 20 74 6f 20 74 68 65 20 42 74 53 68 61 72  ry to the BtShar
0f20: 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53  ed.pLock list. S
0f30: 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20  ee.  ** comment 
0f40: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72  in function quer
0f50: 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72  yTableLock() for
0f60: 20 6d 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61   more info on ha
0f70: 6e 64 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65  ndling .  ** the
0f80: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
0f90: 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66   flag..  */.  if
0fa0: 28 20 0a 20 20 20 20 28 70 2d 3e 70 53 71 6c 69  ( .    (p->pSqli
0fb0: 74 65 29 20 26 26 20 0a 20 20 20 20 28 70 2d 3e  te) && .    (p->
0fc0: 70 53 71 6c 69 74 65 2d 3e 66 6c 61 67 73 26 53  pSqlite->flags&S
0fd0: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
0fe0: 69 74 74 65 64 29 20 26 26 20 0a 20 20 20 20 28  itted) && .    (
0ff0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1000: 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c 65 21  ) &&.    iTable!
1010: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
1020: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1030: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
1040: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
1050: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
1060: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
1070: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
1080: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1090: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
10a0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
10b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
10c0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
10d0: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
10e0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
10f0: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
1100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1110: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1120: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
1130: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
1140: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
1150: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
1160: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
1170: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
1180: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
1190: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
11a0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
11b0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
11c0: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
11d0: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42 74  Malloc(sizeof(Bt
11e0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
11f0: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
1200: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1210: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
1220: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
1230: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
1240: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1250: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
1260: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
1270: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
1280: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
1290: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
12a0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
12b0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
12c0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
12d0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
12e0: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
12f0: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
1300: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
1310: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
1320: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
1330: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
1340: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
1350: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
1360: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1370: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
1380: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
1390: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
13a0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
13b0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
13c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
13d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13e0: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
13f0: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
1400: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
1410: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 6c 6f   calls to the lo
1420: 63 6b 54 61 62 6c 65 28 29 0a 2a 2a 20 70 72 6f  ckTable().** pro
1430: 63 65 64 75 72 65 29 20 68 65 6c 64 20 62 79 20  cedure) held by 
1440: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a  Btree handle p..
1450: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
1460: 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 42  nlockAllTables(B
1470: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 4c 6f  tree *p){.  BtLo
1480: 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70  ck **ppIter = &p
1490: 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20  ->pBt->pLock;.. 
14a0: 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65   /* If the share
14b0: 64 2d 63 61 63 68 65 20 65 78 74 65 6e 73 69 6f  d-cache extensio
14c0: 6e 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  n is not enabled
14d0: 2c 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  , there should b
14e0: 65 20 6e 6f 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20  e no.  ** locks 
14f0: 69 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  in the BtShared.
1500: 70 4c 6f 63 6b 20 6c 69 73 74 2c 20 6d 61 6b 69  pLock list, maki
1510: 6e 67 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  ng this procedur
1520: 65 20 61 20 6e 6f 2d 6f 70 2e 20 41 73 73 65 72  e a no-op. Asser
1530: 74 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73  t.  ** that this
1540: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
1550: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1560: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
1570: 61 64 4f 6e 6c 79 28 29 2d 3e 75 73 65 53 68 61  adOnly()->useSha
1580: 72 65 64 44 61 74 61 20 7c 7c 20 30 3d 3d 2a 70  redData || 0==*p
1590: 70 49 74 65 72 20 29 3b 0a 0a 20 20 77 68 69 6c  pIter );..  whil
15a0: 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20  e( *ppIter ){.  
15b0: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
15c0: 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 69  = *ppIter;.    i
15d0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
15e0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
15f0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
1600: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1610: 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  eFree(pLock);.  
1620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1630: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
1640: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1650: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1660: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1670: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
1680: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
1690: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
16a0: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
16b0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 23 69 66  eference */..#if
16c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16d0: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
16e0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
16f0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1700: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
1710: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
1720: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1730: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1740: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
1750: 20 2a 70 43 75 72 29 7b 0a 20 20 73 71 6c 69 74   *pCur){.  sqlit
1760: 65 46 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  eFree(pCur->aOve
1770: 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e  rflow);.  pCur->
1780: 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d  aOverflow = 0;.}
1790: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
17a0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
17b0: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
17c0: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
17d0: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
17e0: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
17f0: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
1800: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
1810: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1820: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
1830: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
1840: 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42  r *p;.  for(p=pB
1850: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1860: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1870: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1880: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
1890: 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
18a0: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
18b0: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
18c0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
18d0: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
18e0: 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e(x).#endif../*.
18f0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
1900: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
1910: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
1920: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
1930: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
1940: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
1950: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
1960: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
1970: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74  QUIRESEEK..*/.st
1980: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
1990: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
19a0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
19b0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
19c0: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
19d0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
19e0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
19f0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 72 63  r->pKey );..  rc
1a00: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
1a10: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43  eySize(pCur, &pC
1a20: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a  ur->nKey);..  /*
1a30: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
1a40: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
1a50: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
1a60: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
1a70: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
1a80: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
1a90: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
1aa0: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
1ab0: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
1ac0: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
1ad0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1ae0: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
1af0: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
1b00: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
1b10: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
1b20: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
1b30: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
1b40: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
1b50: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ta..  */.  if( r
1b60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b70: 30 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  0==pCur->pPage->
1b80: 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69  intKey){.    voi
1b90: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
1ba0: 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b 65  Malloc(pCur->nKe
1bb0: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  y);.    if( pKey
1bc0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1bd0: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70  qlite3BtreeKey(p
1be0: 43 75 72 2c 20 30 2c 20 70 43 75 72 2d 3e 6e 4b  Cur, 0, pCur->nK
1bf0: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
1c00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c10: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
1c20: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
1c30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c40: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1c50: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
1c60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1c80: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
1c90: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 70  assert( !pCur->p
1ca0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  Page->intKey || 
1cb0: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a  !pCur->pKey );..
1cc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  _OK ){.    relea
1ce0: 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
1cf0: 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ge);.    pCur->p
1d00: 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
1d10: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1d20: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
1d30: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
1d40: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1d50: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
1d60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
1d70: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
1d80: 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65  of all cursors e
1d90: 78 63 65 70 74 20 70 45 78 63 65 70 74 20 6f 70  xcept pExcept op
1da0: 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  en on the table 
1db0: 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  .** with root-pa
1dc0: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
1dd0: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
1de0: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
1df0: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
1e00: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
1e10: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
1e20: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
1e30: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
1e40: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
1e50: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
1e60: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
1e70: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
1e80: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
1e90: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
1ea0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
1eb0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1ec0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
1ed0: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
1ee0: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
1ef0: 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20  Root) && .      
1f00: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52    p->eState==CUR
1f10: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1f20: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
1f30: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1f40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
1f50: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
1f60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1fa0: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
1fb0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
1fc0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1fd0: 64 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  d clearCursorPos
1fe0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
1ff0: 70 43 75 72 29 7b 0a 20 20 73 71 6c 69 74 65 46  pCur){.  sqliteF
2000: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
2010: 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20  .  pCur->pKey = 
2020: 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  0;.  pCur->eStat
2030: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2040: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  ID;.}../*.** Res
2050: 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  tore the cursor 
2060: 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
2070: 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73  it was in (or as
2080: 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73   close to as pos
2090: 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73  sible).** when s
20a0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
20b0: 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  n() was called. 
20c0: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
20d0: 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20  all deletes the 
20e0: 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69  .** saved positi
20f0: 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62  on info stored b
2100: 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  y saveCursorPosi
2110: 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65  tion(), so there
2120: 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f   can be.** at mo
2130: 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65  st one effective
2140: 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
2150: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
2160: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
2170: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
2180: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20  sition()..**.** 
2190: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
21a0: 67 75 6d 65 6e 74 20 61 72 67 75 6d 65 6e 74 20  gument argument 
21b0: 2d 20 64 6f 53 65 65 6b 20 2d 20 69 73 20 66 61  - doSeek - is fa
21c0: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  lse, then instea
21d0: 64 20 6f 66 20 0a 2a 2a 20 72 65 74 75 72 6e 69  d of .** returni
21e0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
21f0: 20 69 74 27 73 20 73 61 76 65 64 20 70 6f 73 69   it's saved posi
2200: 74 69 6f 6e 2c 20 61 6e 79 20 73 61 76 65 64 20  tion, any saved 
2210: 70 6f 73 69 74 69 6f 6e 20 69 73 20 64 65 6c 65  position is dele
2220: 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63  ted.** and the c
2230: 75 72 73 6f 72 20 73 74 61 74 65 20 73 65 74 20  ursor state set 
2240: 74 6f 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  to CURSOR_INVALI
2250: 44 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  D..*/.int sqlite
2260: 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f 72 43  3BtreeRestoreOrC
2270: 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2280: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
2290: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
22a0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
22b0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51  tate==CURSOR_REQ
22c0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 23 69 66 6e  UIRESEEK );.#ifn
22d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22e0: 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 28 20 70  INCRBLOB.  if( p
22f0: 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
2300: 61 6e 64 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  andle ){.    ret
2310: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
2320: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
2330: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2340: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2350: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2360: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43  eMoveto(pCur, pC
2370: 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e  ur->pKey, pCur->
2380: 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e  nKey, 0, &pCur->
2390: 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d  skip);.  if( rc=
23a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 75    sqliteFree(pCu
23c0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
23d0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
23e0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23f0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2400: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2410: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2420: 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65  ALID );.  }.  re
2430: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
2440: 69 6e 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  ine restoreOrCle
2450: 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2460: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
2470: 74 65 3d 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te==CURSOR_REQUI
2480: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
2490: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24a0: 52 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  RestoreOrClearCu
24b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
24c0: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
24d0: 49 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e 64 65 66  ITE_OK)..#ifndef
24e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
24f0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
2500: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
2510: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
2520: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
2530: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
2540: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2550: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2560: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2570: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
2580: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
2590: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
25a0: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
25b0: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
25c0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
25d0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
25e0: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
25f0: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
2600: 69 6e 74 20 69 50 74 72 4d 61 70 20 3d 20 28 70  int iPtrMap = (p
2610: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
2620: 4d 61 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72  MapPage;.  int r
2630: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
2640: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
2650: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
2660: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2670: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
2680: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
2690: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
26a0: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
26b0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
26c0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
26d0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
26e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
26f0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
2700: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
2710: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
2720: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
2730: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
2740: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
2750: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
2760: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
2770: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
2780: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
2790: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
27a0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
27b0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
27c0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
27d0: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
27e0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
27f0: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
2800: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
2810: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
2820: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
2830: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
2840: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
2850: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
2860: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
2870: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
2880: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
2890: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
28a0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
28b0: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
28c0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
28d0: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
28e0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
28f0: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
2900: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
2910: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
2920: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
2930: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
2940: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
2950: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
2960: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
2970: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2980: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2990: 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20    }.  iPtrmap = 
29a0: 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
29b0: 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20  t, key);.  rc = 
29c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
29d0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74  pBt->pPager, iPt
29e0: 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b  rmap, &pDbPage);
29f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2a00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
2a10: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66  rn rc;.  }.  off
2a20: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
2a30: 4f 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29  OFFSET(pBt, key)
2a40: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
2a50: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
2a60: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
2a70: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
2a80: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
2a90: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
2aa0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
2ab0: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
2ac0: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
2ad0: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
2ae0: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
2af0: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
2b00: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b10: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
2b20: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b40: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
2b50: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
2b60: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
2b70: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
2b80: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
2b90: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2ba0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
2bb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2bc0: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
2bd0: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
2be0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
2bf0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
2c00: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
2c10: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
2c20: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
2c30: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
2c40: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
2c50: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
2c60: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
2c70: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
2c80: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2c90: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
2ca0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
2cb0: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
2cc0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
2cd0: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
2ce0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
2cf0: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
2d00: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
2d10: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
2d20: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
2d30: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
2d40: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
2d50: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2d60: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
2d70: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
2d80: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2d90: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
2da0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
2db0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2dc0: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
2dd0: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
2de0: 6e 74 20 72 63 3b 0a 0a 20 20 69 50 74 72 6d 61  nt rc;..  iPtrma
2df0: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
2e00: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
2e10: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e20: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
2e30: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
2e40: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
2e50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2e60: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
2e70: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
2e80: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
2e90: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
2ea0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
2eb0: 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  SET(pBt, key);. 
2ec0: 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21   assert( pEType!
2ed0: 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20  =0 );.  *pEType 
2ee0: 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  = pPtrmap[offset
2ef0: 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29  ];.  if( pPgno )
2f00: 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79   *pPgno = get4by
2f10: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
2f20: 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  et+1]);..  sqlit
2f30: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
2f40: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45  Page);.  if( *pE
2f50: 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70  Type<1 || *pETyp
2f60: 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e>5 ) return SQL
2f70: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2f90: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
2fa0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
2fb0: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a  UTOVACUUM */../*
2fc0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
2fd0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
2fe0: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
2ff0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
3000: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
3010: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
3020: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
3030: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
3040: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
3050: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
3060: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3070: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
3080: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
3090: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
30a0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
30b0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
30c0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 20 5c 0a  pPage, iCell) \.
30d0: 20 20 28 28 70 50 61 67 65 29 2d 3e 61 44 61 74    ((pPage)->aDat
30e0: 61 20 2b 20 67 65 74 32 62 79 74 65 28 26 28 70  a + get2byte(&(p
30f0: 50 61 67 65 29 2d 3e 61 44 61 74 61 5b 28 70 50  Page)->aData[(pP
3100: 61 67 65 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  age)->cellOffset
3110: 2b 32 2a 28 69 43 65 6c 6c 29 5d 29 29 0a 75 38  +2*(iCell)])).u8
3120: 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 69   *sqlite3BtreeFi
3130: 6e 64 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  ndCell(MemPage *
3140: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
3150: 29 7b 0a 20 20 75 38 20 2a 64 61 74 61 20 3d 20  ){.  u8 *data = 
3160: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
3170: 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30  assert( iCell>=0
3180: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
3190: 65 6c 6c 3c 67 65 74 32 62 79 74 65 28 26 64 61  ell<get2byte(&da
31a0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
31b0: 73 65 74 2b 33 5d 29 20 29 3b 0a 20 20 72 65 74  set+3]) );.  ret
31c0: 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  urn findCell(pPa
31d0: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f  ge, iCell);.}../
31e0: 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65  *.** This a more
31f0: 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e   complex version
3200: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
3210: 46 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20  FindCell() that 
3220: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67  works for.** pag
3230: 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61  es that do conta
3240: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
3250: 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a  s.  See insert.*
3260: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e  /.static u8 *fin
3270: 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65  dOverflowCell(Me
3280: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
3290: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20  t iCell){.  int 
32a0: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  i;.  for(i=pPage
32b0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
32c0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
32d0: 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74  nt k;.    struct
32e0: 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66   _OvflCell *pOvf
32f0: 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26  l;.    pOvfl = &
3300: 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b  pPage->aOvfl[i];
3310: 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e  .    k = pOvfl->
3320: 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d  idx;.    if( k<=
3330: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  iCell ){.      i
3340: 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k==iCell ){. 
3350: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f         return pO
3360: 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20  vfl->pCell;.    
3370: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
3380: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
3390: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
33a0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
33b0: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
33c0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
33d0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
33e0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
33f0: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
3400: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
3410: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
3420: 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  n.  sqlite3Btree
3430: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
3440: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
3450: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
3460: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 71   argument and sq
3470: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3480: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
3490: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
34a0: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
34b0: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
34c0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
34d0: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66  ** Within this f
34e0: 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65  ile, the parseCe
34f0: 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62  ll() macro can b
3500: 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
3510: 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   of.** sqlite3Bt
3520: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3530: 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f  ). Using some co
3540: 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69  mpilers, this wi
3550: 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f  ll be faster..*/
3560: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
3570: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
3580: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
3590: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
35a0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
35b0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
35c0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
35d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
35e0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
35f0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
3600: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
3610: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
3620: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ucture */.){.  i
3630: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
3640: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3650: 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63   bytes in cell c
3660: 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f  ontent header */
3670: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
3680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3690: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
36a0: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
36b0: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
36c0: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
36d0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
36e0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
36f0: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
3700: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
3710: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
3720: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
3730: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
3740: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
3750: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
3760: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 26 6e 50 61 79  &pCell[n], &nPay
3770: 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  load);.  }else{.
3780: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30      nPayload = 0
3790: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
37a0: 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Data = nPayload;
37b0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
37c0: 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  tKey ){.    n +=
37d0: 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c   getVarint(&pCel
37e0: 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a 29 26 70 49  l[n], (u64 *)&pI
37f0: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65  nfo->nKey);.  }e
3800: 6c 73 65 7b 0a 20 20 20 20 75 33 32 20 78 3b 0a  lse{.    u32 x;.
3810: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
3820: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
3830: 26 78 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  &x);.    pInfo->
3840: 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20 20 6e 50  nKey = x;.    nP
3850: 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a 20 20 7d  ayload += x;.  }
3860: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
3870: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
3880: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
3890: 3d 20 6e 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  = n;.  if( nPayl
38a0: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
38b0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
38c0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
38d0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
38e0: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
38f0: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
3900: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
3910: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
3920: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
3930: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
3940: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Size;          /
3950: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
3960: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
3970: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 70 49 6e  bytes */.    pIn
3980: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61  fo->nLocal = nPa
3990: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
39a0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
39b0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61  .    nSize = nPa
39c0: 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 69  yload + n;.    i
39d0: 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20  f( nSize<4 ){.  
39e0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20      nSize = 4;  
39f0: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
3a00: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
3a10: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  */.    }.    pIn
3a20: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a  fo->nSize = nSiz
3a30: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3a40: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
3a50: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
3a60: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
3a70: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
3a80: 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64  have.    ** to d
3a90: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
3aa0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
3ab0: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
3ac0: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a  spill onto.    *
3ad0: 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * overflow pages
3ae0: 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20  .  The strategy 
3af0: 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  is to minimize t
3b00: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75  he amount of unu
3b10: 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  sed.    ** space
3b20: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
3b30: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
3b40: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
3b50: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20  ocal storage.   
3b60: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
3b70: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
3b80: 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ocal..    **.   
3b90: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
3ba0: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
3bb0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
3bc0: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
3bd0: 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79  n any.    ** way
3be0: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
3bf0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
3c00: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20  file format..   
3c10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   */.    int minL
3c20: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
3c30: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
3c40: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
3c50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c   */.    int maxL
3c60: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75  ocal;  /* Maximu
3c70: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
3c80: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
3c90: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70   */.    int surp
3ca0: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
3cb0: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
3cc0: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
3cd0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d  torage */..    m
3ce0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
3cf0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d  >minLocal;.    m
3d00: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
3d10: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73  >maxLocal;.    s
3d20: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
3d30: 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  l + (nPayload - 
3d40: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
3d50: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
3d60: 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20  e - 4);.    if( 
3d70: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
3d80: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
3d90: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72  fo->nLocal = sur
3da0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
3db0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
3dc0: 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  ocal = minLocal;
3dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
3de0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49  ->iOverflow = pI
3df0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b  nfo->nLocal + n;
3e00: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
3e10: 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72  e = pInfo->iOver
3e20: 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a  flow + 4;.  }.}.
3e30: 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c  #define parseCel
3e40: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
3e50: 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74  pInfo) \.  sqlit
3e60: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3e70: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
3e80: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
3e90: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
3ea0: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  ).void sqlite3Bt
3eb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
3ec0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
3ed0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
3ee0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
3ef0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
3f00: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
3f10: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
3f20: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
3f30: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
3f40: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
3f50: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
3f60: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
3f70: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
3f80: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
3f90: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
3fa0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
3fb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
3fc0: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
3fd0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
3fe0: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
3ff0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
4000: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
4010: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
4020: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
4030: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
4040: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
4050: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
4060: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
4070: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
4080: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23  ll pointer..*/.#
4090: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
40a0: 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 53 69 7a  atic int cellSiz
40b0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
40c0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
40d0: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
40e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
40f0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
4100: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72  ell, &info);.  r
4110: 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65  eturn info.nSize
4120: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ;.}.#endif.stati
4130: 63 20 69 6e 74 20 63 65 6c 6c 53 69 7a 65 50 74  c int cellSizePt
4140: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
4150: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
4160: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
4170: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4180: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
4190: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
41a0: 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53    return info.nS
41b0: 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ize;.}..#ifndef 
41c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
41d0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
41e0: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
41f0: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
4200: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
4210: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
4220: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
4230: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
4240: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
4250: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
4260: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
4270: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
4280: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
4290: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
42a0: 70 43 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43  pCell){.  if( pC
42b0: 65 6c 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c 49  ell ){.    CellI
42c0: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 73 71  nfo info;.    sq
42d0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
42e0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
42f0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
4300: 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e   assert( (info.n
4310: 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
4320: 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
4330: 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  )==info.nPayload
4340: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 66   );.    if( (inf
4350: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
4360: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
4370: 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
4380: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f   ){.      Pgno o
4390: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
43a0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
43b0: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 72 65  flow]);.      re
43c0: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
43d0: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
43e0: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
43f0: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  1, pPage->pgno);
4400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4410: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4420: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
4430: 6c 6c 20 77 69 74 68 20 69 6e 64 65 78 20 69 43  ll with index iC
4440: 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
4450: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
4460: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
4470: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
4480: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
4490: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
44a0: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
44b0: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
44c0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
44d0: 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20  PutOvfl(MemPage 
44e0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
44f0: 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  l){.  u8 *pCell;
4500: 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 4f  .  pCell = findO
4510: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
4520: 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65 74  e, iCell);.  ret
4530: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66  urn ptrmapPutOvf
4540: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4550: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  l);.}.#endif.../
4560: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
4570: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
4580: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
4590: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
45a0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
45b0: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
45c0: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
45d0: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
45e0: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
45f0: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
4600: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
4610: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
4620: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
4630: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
4640: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
4650: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
4660: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
4670: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
4680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
4690: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
46a0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
46b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
46c0: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
46d0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ll */.  int addr
46e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
46f0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
4700: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
4710: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
4720: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ray */.  int hdr
4730: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4740: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
4750: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
4760: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
4790: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
47a0: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
47b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
47c0: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
47d0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
47e0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
47f0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
4800: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
4810: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
4820: 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20  int brk;        
4830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
4840: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
4850: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
4860: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4880: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
4890: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
48a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
48b0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
48c0: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
48d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
48e0: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
48f0: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
4900: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  ell content */..
4910: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4920: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
4930: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
4940: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
4950: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
4960: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
4970: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
4980: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
4990: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
49a0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
49b0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74  erflow==0 );.  t
49c0: 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  emp = sqliteMall
49d0: 6f 63 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  oc( pPage->pBt->
49e0: 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  pageSize );.  if
49f0: 28 20 74 65 6d 70 3d 3d 30 20 29 20 72 65 74 75  ( temp==0 ) retu
4a00: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4a10: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
4a20: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
4a30: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
4a40: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
4a50: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
4a60: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
4a70: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
4a80: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
4a90: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
4aa0: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
4ab0: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
4ac0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
4ad0: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
4ae0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
4af0: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b  memcpy(&temp[brk
4b00: 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75  ], &data[brk], u
4b10: 73 61 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29  sableSize - brk)
4b20: 3b 0a 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65  ;.  brk = usable
4b30: 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Size;.  for(i=0;
4b40: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
4b50: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
4b60: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
4b70: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
4b80: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
4b90: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
4ba0: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
4bb0: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
4bc0: 20 20 61 73 73 65 72 74 28 20 70 63 3c 70 50 61    assert( pc<pPa
4bd0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
4be0: 69 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ize );.    size 
4bf0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
4c00: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
4c10: 0a 20 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65  .    brk -= size
4c20: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
4c30: 74 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70  ta[brk], &temp[p
4c40: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70  c], size);.    p
4c50: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 62  ut2byte(pAddr, b
4c60: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
4c70: 74 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73  t( brk>=cellOffs
4c80: 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  et+2*nCell );.  
4c90: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
4ca0: 64 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64  dr+5], brk);.  d
4cb0: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
4cc0: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
4cd0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  0;.  data[hdr+7]
4ce0: 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63   = 0;.  addr = c
4cf0: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c  ellOffset+2*nCel
4d00: 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  l;.  memset(&dat
4d10: 61 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d  a[addr], 0, brk-
4d20: 61 64 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 46  addr);.  sqliteF
4d30: 72 65 65 28 74 65 6d 70 29 3b 0a 20 20 72 65 74  ree(temp);.  ret
4d40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
4d50: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
4d60: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
4d70: 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e  space on a page.
4d80: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
4d90: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
4da0: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74  ge->aData[] of t
4db0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
4dc0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f  .** the new allo
4dd0: 63 61 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72  cation. Or retur
4de0: 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73 20  n 0 if there is 
4df0: 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72 65 65 0a  not enough free.
4e00: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ** space on the 
4e10: 70 61 67 65 20 74 6f 20 73 61 74 69 73 66 79 20  page to satisfy 
4e20: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72  the allocation r
4e30: 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  equest..**.** If
4e40: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
4e50: 6e 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65  ns nBytes of fre
4e60: 65 20 73 70 61 63 65 20 62 75 74 20 64 6f 65 73  e space but does
4e70: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   not contain.** 
4e80: 6e 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67  nBytes of contig
4e90: 75 6f 75 73 20 66 72 65 65 20 73 70 61 63 65 2c  uous free space,
4ea0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
4eb0: 6e 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ne automatically
4ec0: 0a 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67  .** calls defrag
4ed0: 65 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63  ementPage() to c
4ee0: 6f 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66  onsolidate all f
4ef0: 72 65 65 20 73 70 61 63 65 20 62 65 66 6f 72 65  ree space before
4f00: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20   .** allocating 
4f10: 74 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a  the new chunk..*
4f20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
4f30: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
4f40: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
4f50: 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  Byte){.  int add
4f60: 72 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e  r, pc, hdr;.  in
4f70: 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46  t size;.  int nF
4f80: 72 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a  rag;.  int top;.
4f90: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69    int nCell;.  i
4fa0: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  nt cellOffset;. 
4fb0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4fc0: 64 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20  data;.  .  data 
4fd0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
4fe0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4ff0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
5000: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
5010: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5020: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 69  Page->pBt );.  i
5030: 66 28 20 6e 42 79 74 65 3c 34 20 29 20 6e 42 79  f( nByte<4 ) nBy
5040: 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 70 50  te = 4;.  if( pP
5050: 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42 79 74 65  age->nFree<nByte
5060: 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   || pPage->nOver
5070: 66 6c 6f 77 3e 30 20 29 20 72 65 74 75 72 6e 20  flow>0 ) return 
5080: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  0;.  pPage->nFre
5090: 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64  e -= nByte;.  hd
50a0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
50b0: 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  fset;..  nFrag =
50c0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
50d0: 69 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a  if( nFrag<60 ){.
50e0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
50f0: 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  e freelist looki
5100: 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69  ng for a slot bi
5110: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
5120: 73 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  sfy the.    ** s
5130: 70 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f  pace request. */
5140: 0a 20 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b  .    addr = hdr+
5150: 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70  1;.    while( (p
5160: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
5170: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
5180: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
5190: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
51a0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ]);.      if( si
51b0: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
51c0: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42       if( size<nB
51d0: 79 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  yte+4 ){.       
51e0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
51f0: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
5200: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
5210: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46  data[hdr+7] = nF
5220: 72 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79  rag + size - nBy
5230: 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  te;.          re
5240: 74 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20  turn pc;.       
5250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5260: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
5270: 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79  [pc+2], size-nBy
5280: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  te);.          r
5290: 65 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20  eturn pc + size 
52a0: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
52b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
52c0: 20 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20   addr = pc;.    
52d0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
52e0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
52f0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
5300: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
5310: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
5320: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
5330: 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a  tent area..  */.
5340: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
5350: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
5360: 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79    nCell = get2by
5370: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
5380: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
5390: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
53a0: 65 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  et;.  if( nFrag>
53b0: 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65  =60 || cellOffse
53c0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f  t + 2*nCell > to
53d0: 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  p - nByte ){.   
53e0: 20 69 66 28 20 64 65 66 72 61 67 6d 65 6e 74 50   if( defragmentP
53f0: 61 67 65 28 70 50 61 67 65 29 20 29 20 72 65 74  age(pPage) ) ret
5400: 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f 70 20 3d  urn 0;.    top =
5410: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5420: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74  hdr+5]);.  }.  t
5430: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61  op -= nByte;.  a
5440: 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65  ssert( cellOffse
5450: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74  t + 2*nCell <= t
5460: 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  op );.  put2byte
5470: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
5480: 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  op);.  return to
5490: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
54a0: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
54b0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
54c0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
54d0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
54e0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
54f0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
5500: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
5510: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
5520: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
5530: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
5540: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
5550: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
5560: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
5570: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
5580: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
5590: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
55a0: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
55b0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53  tatic void freeS
55c0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
55d0: 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20  age, int start, 
55e0: 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74  int size){.  int
55f0: 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68   addr, pbegin, h
5600: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
5610: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
5620: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
5630: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
5640: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5650: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5660: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5670: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5680: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
5690: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
56a0: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
56b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
56c0: 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50  tart + size)<=pP
56d0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
56e0: 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 69  Size );.  if( si
56f0: 7a 65 3c 34 20 29 20 73 69 7a 65 20 3d 20 34 3b  ze<4 ) size = 4;
5700: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5710: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
5720: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
5730: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
5740: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
5750: 20 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45   the SECURE_DELE
5760: 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  TE .  ** option 
5770: 69 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  is enabled at co
5780: 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20  mpile-time */.  
5790: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61  memset(&data[sta
57a0: 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23  rt], 0, size);.#
57b0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20  endif..  /* Add 
57c0: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
57d0: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
57e0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
57f0: 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61  s */.  hdr = pPa
5800: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
5810: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
5820: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
5830: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
5840: 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74  ta[addr]))<start
5850: 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a   && pbegin>0 ){.
5860: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
5870: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
5880: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
5890: 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67      assert( pbeg
58a0: 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61  in>addr );.    a
58b0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
58c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67  }.  assert( pbeg
58d0: 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  in<=pPage->pBt->
58e0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
58f0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
5900: 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d  >addr || pbegin=
5910: 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  =0 );.  put2byte
5920: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74  (&data[addr], st
5930: 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65  art);.  put2byte
5940: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70  (&data[start], p
5950: 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79  begin);.  put2by
5960: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32  te(&data[start+2
5970: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67  ], size);.  pPag
5980: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65  e->nFree += size
5990: 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65  ;..  /* Coalesce
59a0: 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62   adjacent free b
59b0: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20  locks */.  addr 
59c0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
59d0: 65 74 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  et + 1;.  while(
59e0: 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62   (pbegin = get2b
59f0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
5a00: 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  )>0 ){.    int p
5a10: 6e 65 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20  next, psize;.   
5a20: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
5a30: 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  addr );.    asse
5a40: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
5a50: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
5a60: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78  ze-4 );.    pnex
5a70: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
5a80: 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20  ta[pbegin]);.   
5a90: 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74   psize = get2byt
5aa0: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
5ab0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67  ]);.    if( pbeg
5ac0: 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e  in + psize + 3 >
5ad0: 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74  = pnext && pnext
5ae0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
5af0: 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28  frag = pnext - (
5b00: 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20  pbegin+psize);. 
5b10: 20 20 20 20 20 61 73 73 65 72 74 28 20 66 72 61       assert( fra
5b20: 67 3c 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  g<=data[pPage->h
5b30: 64 72 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20  drOffset+7] );. 
5b40: 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d       data[pPage-
5b50: 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d  >hdrOffset+7] -=
5b60: 20 66 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74   frag;.      put
5b70: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
5b80: 69 6e 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64  in], get2byte(&d
5b90: 61 74 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20  ata[pnext]));.  
5ba0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
5bb0: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e  ta[pbegin+2], pn
5bc0: 65 78 74 2b 67 65 74 32 62 79 74 65 28 26 64 61  ext+get2byte(&da
5bd0: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65  ta[pnext+2])-pbe
5be0: 67 69 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  gin);.    }else{
5bf0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
5c00: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
5c10: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
5c20: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
5c30: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
5c40: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
5c50: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
5c60: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
5c70: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
5c80: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
5c90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
5ca0: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
5cb0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
5cc0: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
5cd0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
5ce0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
5cf0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
5d00: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
5d10: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
5d20: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
5d30: 6f 70 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  op + get2byte(&d
5d40: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b  ata[pbegin+2]));
5d50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
5d60: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
5d70: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
5d80: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
5d90: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
5da0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
5db0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
5dc0: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
5dd0: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a  accordingly..*/.
5de0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 63 6f  static void deco
5df0: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
5e00: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
5e10: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
5e20: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
5e30: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
5e40: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
5e50: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
5e60: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
5e70: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
5e80: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ;.  pPage->intKe
5e90: 79 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20  y = (flagByte & 
5ea0: 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
5eb0: 4c 45 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20  LEAFDATA))!=0;. 
5ec0: 20 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61   pPage->zeroData
5ed0: 20 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 50   = (flagByte & P
5ee0: 54 46 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b  TF_ZERODATA)!=0;
5ef0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
5f00: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
5f10: 5f 4c 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61  _LEAF)!=0;.  pPa
5f20: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
5f30: 20 3d 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61   = 4*(pPage->lea
5f40: 66 3d 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70  f==0);.  pBt = p
5f50: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
5f60: 20 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f   flagByte & PTF_
5f70: 4c 45 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20  LEAFDATA ){.    
5f80: 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
5f90: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
5fa0: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
5fb0: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
5fc0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
5fd0: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
5fe0: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d  else{.    pPage-
5ff0: 3e 6c 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20  >leafData = 0;. 
6000: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
6010: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
6020: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
6030: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
6040: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
6050: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
6060: 21 28 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74  !(pPage->zeroDat
6070: 61 20 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65  a || (!pPage->le
6080: 61 66 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61  af && pPage->lea
6090: 66 44 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  fData));.}../*.*
60a0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
60b0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
60c0: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
60d0: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  k block..**.** T
60e0: 68 65 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d  he pParent param
60f0: 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 70  eter must be a p
6100: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
6110: 6d 50 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69  mPage which.** i
6120: 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  s the parent of 
6130: 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 69  the page being i
6140: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65  nitialized.  The
6150: 20 72 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54   root of a.** BT
6160: 72 65 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e  ree has no paren
6170: 74 20 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61  t and so for tha
6180: 74 20 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d  t page, pParent=
6190: 3d 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  =NULL..**.** Ret
61a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
61b0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
61c0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
61d0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
61e0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
61f0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
6200: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
6210: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
6220: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
6230: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
6240: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
6250: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
6260: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
6270: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
6280: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
6290: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
62a0: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
62b0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
62c0: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
62d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
62e0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e,        /* The
62f0: 20 70 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74   page to be init
6300: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d  ialized */.  Mem
6310: 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20  Page *pParent   
6320: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
6330: 74 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  t.  Might be NUL
6340: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63  L */.){.  int pc
6350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6360: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
6370: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
6380: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
6390: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
63a0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
63b0: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
63c0: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
63d0: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
63e0: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
63f0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
6400: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
6410: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
6420: 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75  in btree structu
6430: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  re */.  int usab
6440: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
6450: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
6460: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
6470: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
6480: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
6490: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
64a0: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
64b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
64c0: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
64d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
64e0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
64f0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
6500: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
6510: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
6520: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
6530: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20  tent area */..  
6540: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
6550: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 21  ;.  assert( pBt!
6560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6570: 70 50 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50  pParent==0 || pP
6580: 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20  arent->pBt==pBt 
6590: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
65a0: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
65b0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
65c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
65d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
65e0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 26 28  age->aData == &(
65f0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
6600: 70 50 61 67 65 29 5b 2d 70 42 74 2d 3e 70 61 67  pPage)[-pBt->pag
6610: 65 53 69 7a 65 5d 20 29 3b 0a 20 20 69 66 28 20  eSize] );.  if( 
6620: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d  pPage->pParent!=
6630: 70 50 61 72 65 6e 74 20 26 26 20 28 70 50 61 67  pParent && (pPag
6640: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c  e->pParent!=0 ||
6650: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20   pPage->isInit) 
6660: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
6670: 72 65 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64  rent page should
6680: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e   never change un
6690: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 69 73  less the file is
66a0: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
66b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
66c0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
66d0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
66e0: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
66f0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
6700: 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
6710: 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b  && pParent!=0 ){
6720: 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72  .    pPage->pPar
6730: 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
6740: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
6750: 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
6760: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20  age);.  }.  hdr 
6770: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
6780: 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
6790: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64 65 63  ge->aData;.  dec
67a0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
67b0: 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20 70 50  data[hdr]);.  pP
67c0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
67d0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   0;.  pPage->idx
67e0: 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75 73 61  Shift = 0;.  usa
67f0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
6800: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61  sableSize;.  pPa
6810: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
6820: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
6830: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
6840: 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20  ->leaf;.  top = 
6850: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
6860: 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d  dr+5]);.  pPage-
6870: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
6880: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
6890: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
68a0: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
68b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
68c0: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
68d0: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
68e0: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
68f0: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
6900: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
6910: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
6920: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
6930: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30  =0 && pParent!=0
6940: 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
6950: 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41  o!=1 ){.    /* A
6960: 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20 68 61  ll pages must ha
6970: 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ve at least one 
6980: 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f 72  cell, except for
6990: 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20   root pages */. 
69a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
69b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
69c0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
69d0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
69e0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
69f0: 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32  e */.  pc = get2
6a00: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
6a10: 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61  ]);.  nFree = da
6a20: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20  ta[hdr+7] + top 
6a30: 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  - (cellOffset + 
6a40: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  2*pPage->nCell);
6a50: 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29  .  while( pc>0 )
6a60: 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20  {.    int next, 
6a70: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
6a80: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b  >usableSize-4 ){
6a90: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
6aa0: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
6ab0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  page */.      re
6ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6ad0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
6ae0: 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32  .    next = get2
6af0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
6b00: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
6b10: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
6b20: 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e  );.    if( next>
6b30: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
6b40: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ze+3 ){.      /*
6b50: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
6b60: 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e  t be in accendin
6b70: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
6b80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6b90: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
6ba0: 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d    }.    nFree +=
6bb0: 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20   size;.    pc = 
6bc0: 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67  next;.  }.  pPag
6bd0: 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65  e->nFree = nFree
6be0: 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75  ;.  if( nFree>=u
6bf0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
6c00: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
6c10: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
6c20: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
6c30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6c40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
6c50: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 2d 3e 69  .  }..  pPage->i
6c60: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65 74  sInit = 1;.  ret
6c70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6c80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
6c90: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
6ca0: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
6cb0: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
6cc0: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
6cd0: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
6ce0: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
6cf0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
6d00: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
6d10: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
6d20: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
6d30: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
6d40: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
6d50: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
6d60: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
6d70: 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  nt first;..  ass
6d80: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
6d90: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
6da0: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
6db0: 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
6dc0: 73 65 72 74 28 20 26 64 61 74 61 5b 70 42 74 2d  sert( &data[pBt-
6dd0: 3e 70 61 67 65 53 69 7a 65 5d 20 3d 3d 20 28 75  >pageSize] == (u
6de0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 50  nsigned char*)pP
6df0: 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
6e00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
6e10: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
6e20: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 6d 65  pDbPage) );.  me
6e30: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
6e40: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
6e50: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61  ize - hdr);.  da
6e60: 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b  ta[hdr] = flags;
6e70: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
6e80: 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50   8 + 4*((flags&P
6e90: 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20  TF_LEAF)==0);.  
6ea0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
6eb0: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
6ec0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
6ed0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
6ee0: 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
6ef0: 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
6f00: 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e  e->nFree = pBt->
6f10: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
6f20: 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  st;.  decodeFlag
6f30: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
6f40: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
6f50: 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61  set = hdr;.  pPa
6f60: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
6f70: 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
6f80: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
6f90: 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
6fa0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  t = 0;.  pPage->
6fb0: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
6fc0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
6fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
6fe0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
6ff0: 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
7000: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
7010: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
7020: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
7030: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   needed..**.** I
7040: 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  f the noContent 
7050: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
7060: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
7070: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a   not care about.
7080: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
7090: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
70a0: 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
70b0: 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
70c0: 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
70d0: 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
70e0: 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
70f0: 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
7100: 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
7110: 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
7120: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
7130: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
7140: 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
7150: 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
7160: 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
7170: 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
7180: 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
7190: 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
71a0: 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
71b0: 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  int..*/.int sqli
71c0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
71d0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
71e0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
71f0: 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
7200: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
7210: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
7220: 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
7230: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
7240: 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
7250: 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
7260: 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
7270: 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
7280: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
7290: 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65   load page conte
72a0: 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  nt if true */.){
72b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
72c0: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44  Page *pPage;.  D
72d0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
72e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
72f0: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
7300: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
7310: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
7320: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
7330: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7340: 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20 28   rc;.  pPage = (
7350: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
7360: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
7370: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
7380: 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
7390: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
73a0: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
73b0: 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61  >pDbPage = pDbPa
73c0: 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74  ge;.  pPage->pBt
73d0: 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d   = pBt;.  pPage-
73e0: 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
73f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
7400: 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d   = pPage->pgno==
7410: 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a  1 ? 100 : 0;.  *
7420: 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
7430: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7440: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  OK;.}../*.** Get
7450: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
7460: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
7470: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
7480: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75  routine.** is ju
7490: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  st a convenience
74a0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
74b0: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
74c0: 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
74d0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 73  eGetPage() and s
74e0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
74f0: 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
7500: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
7510: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
7520: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
7530: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
7540: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
7550: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
7560: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
7570: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
7580: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
7590: 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ,    /* Write th
75a0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
75b0: 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ere */.  MemPage
75c0: 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 2f 2a   *pParent     /*
75d0: 20 50 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70   Parent of the p
75e0: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
75f0: 72 63 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  rc;.  if( pgno==
7600: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7610: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7620: 4b 50 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d  KPT; .  }.  rc =
7630: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
7640: 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
7650: 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  ppPage, 0);.  if
7660: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7670: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
7680: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Init==0 ){.    r
7690: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
76a0: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
76b0: 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
76c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
76d0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
76e0: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
76f0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
7700: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
7710: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  ior.** call to s
7720: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
7730: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
7740: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
7750: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
7760: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
7770: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
7780: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
7790: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
77a0: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
77b0: 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
77c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
77d0: 69 7a 65 5d 3d 3d 28 75 6e 73 69 67 6e 65 64 20  ize]==(unsigned 
77e0: 63 68 61 72 2a 29 70 50 61 67 65 20 29 3b 0a 20  char*)pPage );. 
77f0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
7800: 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  nref(pPage->pDbP
7810: 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  age);.  }.}../*.
7820: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7830: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
7840: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
7850: 6e 74 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  nt for a page.**
7860: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20   reaches zero.  
7870: 57 65 20 6e 65 65 64 20 74 6f 20 75 6e 72 65 66  We need to unref
7880: 20 74 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69   the pParent poi
7890: 6e 74 65 72 20 77 68 65 6e 20 74 68 61 74 0a 2a  nter when that.*
78a0: 2a 20 68 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74  * happens..*/.st
78b0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 44 65  atic void pageDe
78c0: 73 74 72 75 63 74 6f 72 28 44 62 50 61 67 65 20  structor(DbPage 
78d0: 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67 65  *pData, int page
78e0: 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Size){.  MemPage
78f0: 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
7900: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
7910: 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  )==0 );.  pPage 
7920: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
7930: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
7940: 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20  a(pData);.  if( 
7950: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29  pPage->pParent )
7960: 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
7970: 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
7980: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 70 50 61  pParent;.    pPa
7990: 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b  ge->pParent = 0;
79a0: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
79b0: 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 20  (pParent);.  }. 
79c0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
79d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72   0;.}../*.** Dur
79e0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
79f0: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
7a00: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
7a10: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
7a20: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
7a30: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
7a40: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
7a50: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
7a60: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
7a70: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
7a80: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
7a90: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
7aa0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
7ab0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
7ac0: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
7ad0: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
7ae0: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
7af0: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
7b00: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
7b10: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
7b20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7b30: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
7b40: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 70 61 67   *pData, int pag
7b50: 65 53 69 7a 65 29 7b 0a 20 20 4d 65 6d 50 61 67  eSize){.  MemPag
7b60: 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
7b70: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
7b80: 37 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  7)==0 );.  pPage
7b90: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
7ba0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
7bb0: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  ra(pData);.  if(
7bc0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
7bd0: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
7be0: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  nit = 0;.    sql
7bf0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
7c00: 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  e(pPage, pPage->
7c10: 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a  pParent);.  }.}.
7c20: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
7c30: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
7c40: 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
7c50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7c60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
7c70: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
7c80: 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64   NULL.** a new d
7c90: 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72  atabase with a r
7ca0: 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72  andom name is cr
7cb0: 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e  eated.  This ran
7cc0: 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64  domly named.** d
7cd0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
7ce0: 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65  l be deleted whe
7cf0: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
7d00: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
7d10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7d20: 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73  treeOpen(.  cons
7d30: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
7d40: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
7d50: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
7d60: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
7d70: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7d80: 65 33 20 2a 70 53 71 6c 69 74 65 2c 20 20 20 20  e3 *pSqlite,    
7d90: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
7da0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7db0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
7dc0: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
7dd0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
7de0: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
7df0: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
7e00: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
7e10: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
7e20: 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
7e30: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
7e40: 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
7e50: 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
7e60: 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
7e70: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
7e80: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
7e90: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
7ea0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7eb0: 69 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  int nReserve;.  
7ec0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
7ed0: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 23 69  bHeader[100];.#i
7ee0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7ef0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
7f00: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
7f10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
7f20: 4b 49 4f 29 0a 20 20 63 6f 6e 73 74 20 54 68 72  KIO).  const Thr
7f30: 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 3b  eadData *pTsdro;
7f40: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65  .#endif..  /* Se
7f50: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
7f60: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
7f70: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
7f80: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
7f90: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
7fa0: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
7fb0: 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20  se. This symbol 
7fc0: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
7fd0: 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20   if.  ** either 
7fe0: 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61  of the shared-da
7ff0: 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d  ta or autovacuum
8000: 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f   features are co
8010: 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74  mpiled .  ** int
8020: 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20  o the library.. 
8030: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
8040: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
8050: 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64  RED_CACHE) || !d
8060: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8070: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20  IT_AUTOVACUUM). 
8080: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
8090: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
80a0: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
80b0: 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a  db = 0;.  #else.
80c0: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
80d0: 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  Memdb = zFilenam
80e0: 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69  e && !strcmp(zFi
80f0: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
8100: 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65  :");.  #endif.#e
8110: 6e 64 69 66 0a 0a 20 20 70 20 3d 20 73 71 6c 69  ndif..  p = sqli
8120: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
8130: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
8140: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
8150: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8160: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
8170: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
8180: 2d 3e 70 53 71 6c 69 74 65 20 3d 20 70 53 71 6c  ->pSqlite = pSql
8190: 69 74 65 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  ite;..  /* Try t
81a0: 6f 20 66 69 6e 64 20 61 6e 20 65 78 69 73 74 69  o find an existi
81b0: 6e 67 20 42 74 72 65 65 20 73 74 72 75 63 74 75  ng Btree structu
81c0: 72 65 20 6f 70 65 6e 65 64 20 6f 6e 20 7a 46 69  re opened on zFi
81d0: 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 23 69 66 20 21  lename. */.#if !
81e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
81f0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
8200: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
8210: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
8220: 29 0a 20 20 70 54 73 64 72 6f 20 3d 20 73 71 6c  ).  pTsdro = sql
8230: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
8240: 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20  adOnly();.  if( 
8250: 70 54 73 64 72 6f 2d 3e 75 73 65 53 68 61 72 65  pTsdro->useShare
8260: 64 44 61 74 61 20 26 26 20 7a 46 69 6c 65 6e 61  dData && zFilena
8270: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
8280: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c  {.    char *zFul
8290: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
82a0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
82b0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
82c0: 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68    if( !zFullPath
82d0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  name ){.      sq
82e0: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 20 20 20  liteFree(p);.   
82f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8300: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
8310: 20 20 66 6f 72 28 70 42 74 3d 70 54 73 64 72 6f    for(pBt=pTsdro
8320: 2d 3e 70 42 74 72 65 65 3b 20 70 42 74 3b 20 70  ->pBtree; pBt; p
8330: 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
8340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
8350: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
8360: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
8370: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
8380: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
8390: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
83a0: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )) ){.        p-
83b0: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
83c0: 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70      *ppBtree = p
83d0: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  ;.        pBt->n
83e0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Ref++;.        s
83f0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
8400: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
8410: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8420: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
8430: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
8440: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
8450: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
8460: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  *.  ** The follo
8470: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
8480: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
8490: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
84a0: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 2a  he btree are.  *
84b0: 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
84c0: 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
84d0: 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
84e0: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
84f0: 73 75 6c 74 0a 20 20 2a 2a 20 77 68 65 6e 20 63  sult.  ** when c
8500: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
8510: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
8520: 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ture..  */.  ass
8530: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
8540: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
8550: 34 29 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72  4)==4 );.  asser
8560: 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
8570: 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29  8 || sizeof(u64)
8580: 3d 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==4 );.  assert(
8590: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
85a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
85b0: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
85c0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
85d0: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 0a 20 20 70  Pgno)==4 );..  p
85e0: 42 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Bt = sqliteMallo
85f0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  c( sizeof(*pBt) 
8600: 29 3b 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  );.  if( pBt==0 
8610: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
8620: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
8630: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
8640: 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
8650: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 26  lite3PagerOpen(&
8660: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
8670: 6c 65 6e 61 6d 65 2c 20 45 58 54 52 41 5f 53 49  lename, EXTRA_SI
8680: 5a 45 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ZE, flags);.  if
8690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
86a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
86b0: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
86c0: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
86d0: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
86e0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
86f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
8700: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8710: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
8720: 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 42  out;.  }.  p->pB
8730: 74 20 3d 20 70 42 74 3b 0a 0a 20 20 73 71 6c 69  t = pBt;..  sqli
8740: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
8750: 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65  uctor(pBt->pPage
8760: 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  r, pageDestructo
8770: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  r);.  sqlite3Pag
8780: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42  erSetReiniter(pB
8790: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52  t->pPager, pageR
87a0: 65 69 6e 69 74 29 3b 0a 20 20 70 42 74 2d 3e 70  einit);.  pBt->p
87b0: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 70 42  Cursor = 0;.  pB
87c0: 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
87d0: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
87e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
87f0: 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
8800: 67 65 72 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  ger);.  pBt->pag
8810: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
8820: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
8830: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
8840: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
8850: 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
8860: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
8870: 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
8880: 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
8890: 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
88a0: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  {.    pBt->pageS
88b0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
88c0: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
88d0: 20 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65      pBt->maxEmbe
88e0: 64 46 72 61 63 20 3d 20 36 34 3b 20 20 20 2f 2a  dFrac = 64;   /*
88f0: 20 32 35 25 20 2a 2f 0a 20 20 20 20 70 42 74 2d   25% */.    pBt-
8900: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
8910: 33 32 3b 20 20 20 2f 2a 20 31 32 2e 35 25 20 2a  32;   /* 12.5% *
8920: 2f 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  /.    pBt->minLe
8930: 61 66 46 72 61 63 20 3d 20 33 32 3b 20 20 20 20  afFrac = 32;    
8940: 2f 2a 20 31 32 2e 35 25 20 2a 2f 0a 23 69 66 6e  /* 12.5% */.#ifn
8950: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8960: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 2f  AUTOVACUUM.    /
8970: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
8980: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
8990: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
89a0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
89b0: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 6c 65  , then.    ** le
89c0: 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
89d0: 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
89e0: 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
89f0: 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a  ), even if.    *
8a00: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
8a10: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
8a20: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
8a30: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 2a  r hand, if.    *
8a40: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
8a50: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
8a60: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
8a70: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
8a80: 20 61 0a 20 20 20 20 2a 2a 20 72 65 67 75 6c 61   a.    ** regula
8a90: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
8aa0: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
8ab0: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
8ac0: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
8ad0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8ae0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
8af0: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 70  Memdb ){.      p
8b00: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
8b10: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
8b20: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
8b30: 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  : 0);.      pBt-
8b40: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
8b50: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
8b60: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
8b70: 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  : 0);.    }.#end
8b80: 69 66 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  if.    nReserve 
8b90: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
8ba0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
8bb0: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
8bc0: 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61  pBt->maxEmbedFra
8bd0: 63 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 31  c = zDbHeader[21
8be0: 5d 3b 0a 20 20 20 20 70 42 74 2d 3e 6d 69 6e 45  ];.    pBt->minE
8bf0: 6d 62 65 64 46 72 61 63 20 3d 20 7a 44 62 48 65  mbedFrac = zDbHe
8c00: 61 64 65 72 5b 32 32 5d 3b 0a 20 20 20 20 70 42  ader[22];.    pB
8c10: 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d  t->minLeafFrac =
8c20: 20 7a 44 62 48 65 61 64 65 72 5b 32 33 5d 3b 0a   zDbHeader[23];.
8c30: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
8c40: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
8c50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8c60: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
8c70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
8c80: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
8c90: 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
8ca0: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
8cb0: 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  }.  pBt->usableS
8cc0: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
8cd0: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
8ce0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
8cf0: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
8d00: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
8d10: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
8d20: 53 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Size */.  sqlite
8d30: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
8d40: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
8d50: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  Bt->pageSize);..
8d60: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8d70: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
8d80: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
8d90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
8da0: 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 41 64 64 20  ISKIO).  /* Add 
8db0: 74 68 65 20 6e 65 77 20 62 74 72 65 65 20 74 6f  the new btree to
8dc0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
8dd0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 54 68 72   starting at Thr
8de0: 65 61 64 44 61 74 61 2e 70 42 74 72 65 65 2e 0a  eadData.pBtree..
8df0: 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    ** There is no
8e00: 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 6d   chance that a m
8e10: 61 6c 6c 6f 63 28 29 20 6d 61 79 20 66 61 69 6c  alloc() may fail
8e20: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 0a   inside of the .
8e30: 20 20 2a 2a 20 73 71 6c 69 74 65 33 54 68 72 65    ** sqlite3Thre
8e40: 61 64 44 61 74 61 28 29 20 63 61 6c 6c 2c 20 61  adData() call, a
8e50: 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61  s the ThreadData
8e60: 20 73 74 72 75 63 74 75 72 65 20 6d 75 73 74 20   structure must 
8e70: 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
8e80: 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  * been allocated
8e90: 20 66 6f 72 20 70 54 73 64 72 6f 2d 3e 75 73 65   for pTsdro->use
8ea0: 53 68 61 72 65 64 44 61 74 61 20 74 6f 20 62 65  SharedData to be
8eb0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2f 0a   non-zero..  */.
8ec0: 20 20 69 66 28 20 70 54 73 64 72 6f 2d 3e 75 73    if( pTsdro->us
8ed0: 65 53 68 61 72 65 64 44 61 74 61 20 26 26 20 7a  eSharedData && z
8ee0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
8ef0: 65 6d 64 62 20 29 7b 0a 20 20 20 20 70 42 74 2d  emdb ){.    pBt-
8f00: 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 72 6f 2d  >pNext = pTsdro-
8f10: 3e 70 42 74 72 65 65 3b 0a 20 20 20 20 73 71 6c  >pBtree;.    sql
8f20: 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
8f30: 2d 3e 70 42 74 72 65 65 20 3d 20 70 42 74 3b 0a  ->pBtree = pBt;.
8f40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74    }.#endif.  pBt
8f50: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 2a 70  ->nRef = 1;.  *p
8f60: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
8f70: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
8f80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8f90: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
8fa0: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
8fb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
8fc0: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
8fd0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
8fe0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74    sqliteFree(pBt
8ff0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
9000: 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72  e(p);.    *ppBtr
9010: 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ee = 0;.  }.  re
9020: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9030: 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20  * Close an open 
9040: 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76  database and inv
9050: 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73  alidate all curs
9060: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
9070: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74  te3BtreeClose(Bt
9080: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
9090: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
90a0: 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t;.  BtCursor *p
90b0: 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Cur;..#ifndef SQ
90c0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
90d0: 5f 43 41 43 48 45 0a 20 20 54 68 72 65 61 64 44  _CACHE.  ThreadD
90e0: 61 74 61 20 2a 70 54 73 64 3b 0a 23 65 6e 64 69  ata *pTsd;.#endi
90f0: 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  f..  /* Close al
9100: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
9110: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
9120: 2e 20 20 2a 2f 0a 20 20 70 43 75 72 20 3d 20 70  .  */.  pCur = p
9130: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
9140: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
9150: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
9160: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
9170: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
9180: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
9190: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
91a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
91b0: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
91c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
91d0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
91e0: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
91f0: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
9200: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
9210: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
9220: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
9230: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
9240: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
9250: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
9260: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
9270: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
9280: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
9290: 46 72 65 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65  Free(p);..#ifnde
92a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
92b0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
92c0: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
92d0: 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
92e0: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
92f0: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
9300: 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
9310: 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
9320: 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
9330: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
9340: 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
9350: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
9360: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9370: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
9380: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
9390: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 20 29   if( pBt->nRef )
93a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
93b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
93c0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
93d0: 72 65 64 2d 62 74 72 65 65 20 66 72 6f 6d 20 74  red-btree from t
93e0: 68 65 20 74 68 72 65 61 64 20 77 69 64 65 20 6c  he thread wide l
93f0: 69 73 74 2e 20 43 61 6c 6c 20 0a 20 20 2a 2a 20  ist. Call .  ** 
9400: 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e  ThreadDataReadOn
9410: 6c 79 28 29 20 61 6e 64 20 74 68 65 6e 20 63 61  ly() and then ca
9420: 73 74 20 61 77 61 79 20 74 68 65 20 63 6f 6e 73  st away the cons
9430: 74 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  t property of th
9440: 65 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20  e .  ** pointer 
9450: 74 6f 20 61 76 6f 69 64 20 61 6c 6c 6f 63 61 74  to avoid allocat
9460: 69 6e 67 20 74 68 72 65 61 64 20 64 61 74 61 20  ing thread data 
9470: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 72 65 61  if it is not rea
9480: 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 20 20  lly required..  
9490: 2a 2f 0a 20 20 70 54 73 64 20 3d 20 28 54 68 72  */.  pTsd = (Thr
94a0: 65 61 64 44 61 74 61 20 2a 29 73 71 6c 69 74 65  eadData *)sqlite
94b0: 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64 4f  3ThreadDataReadO
94c0: 6e 6c 79 28 29 3b 0a 20 20 69 66 28 20 70 54 73  nly();.  if( pTs
94d0: 64 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 20 29  d->pBtree==pBt )
94e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
94f0: 73 64 3d 3d 73 71 6c 69 74 65 33 54 68 72 65 61  sd==sqlite3Threa
9500: 64 44 61 74 61 28 29 20 29 3b 0a 20 20 20 20 70  dData() );.    p
9510: 54 73 64 2d 3e 70 42 74 72 65 65 20 3d 20 70 42  Tsd->pBtree = pB
9520: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  t->pNext;.  }els
9530: 65 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  e{.    BtShared 
9540: 2a 70 50 72 65 76 3b 0a 20 20 20 20 66 6f 72 28  *pPrev;.    for(
9550: 70 50 72 65 76 3d 70 54 73 64 2d 3e 70 42 74 72  pPrev=pTsd->pBtr
9560: 65 65 3b 20 70 50 72 65 76 20 26 26 20 70 50 72  ee; pPrev && pPr
9570: 65 76 2d 3e 70 4e 65 78 74 21 3d 70 42 74 3b 20  ev->pNext!=pBt; 
9580: 70 50 72 65 76 3d 70 50 72 65 76 2d 3e 70 4e 65  pPrev=pPrev->pNe
9590: 78 74 29 7b 7d 0a 20 20 20 20 69 66 28 20 70 50  xt){}.    if( pP
95a0: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rev ){.      ass
95b0: 65 72 74 28 20 70 54 73 64 3d 3d 73 71 6c 69 74  ert( pTsd==sqlit
95c0: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 29  e3ThreadData() )
95d0: 3b 0a 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70  ;.      pPrev->p
95e0: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
95f0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
9600: 64 69 66 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  dif..  /* Close 
9610: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 66 72  the pager and fr
9620: 65 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  ee the shared-bt
9630: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
9640: 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
9650: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 73 71  >pCursor );.  sq
9660: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
9670: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
9680: 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
9690: 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
96a0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d  hema ){.    pBt-
96b0: 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
96c0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
96d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 74    sqliteFree(pBt
96e0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ->pSchema);.  sq
96f0: 6c 69 74 65 46 72 65 65 28 70 42 74 29 3b 0a 20  liteFree(pBt);. 
9700: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9710: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
9720: 67 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ge the busy hand
9730: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ler callback fun
9740: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
9750: 6c 69 74 65 33 42 74 72 65 65 53 65 74 42 75 73  lite3BtreeSetBus
9760: 79 48 61 6e 64 6c 65 72 28 42 74 72 65 65 20 2a  yHandler(Btree *
9770: 70 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  p, BusyHandler *
9780: 70 48 61 6e 64 6c 65 72 29 7b 0a 20 20 42 74 53  pHandler){.  BtS
9790: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
97a0: 70 42 74 3b 0a 20 20 70 42 74 2d 3e 70 42 75 73  pBt;.  pBt->pBus
97b0: 79 48 61 6e 64 6c 65 72 20 3d 20 70 48 61 6e 64  yHandler = pHand
97c0: 6c 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ler;.  sqlite3Pa
97d0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
97e0: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
97f0: 48 61 6e 64 6c 65 72 29 3b 0a 20 20 72 65 74 75  Handler);.  retu
9800: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9810: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
9820: 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
9830: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
9840: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
9850: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
9860: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
9870: 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
9880: 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
9890: 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
98a0: 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
98b0: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
98c0: 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
98d0: 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
98e0: 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
98f0: 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
9900: 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
9910: 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
9920: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
9930: 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
9940: 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
9950: 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
9960: 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
9970: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
9980: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
9990: 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
99a0: 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
99b0: 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
99c0: 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
99d0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
99e0: 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
99f0: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
9a00: 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
9a10: 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
9a20: 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
9a30: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
9a40: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
9a50: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
9a60: 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
9a70: 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
9a80: 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
9a90: 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
9aa0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
9ab0: 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
9ac0: 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
9ad0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
9ae0: 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
9af0: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
9b00: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
9b10: 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
9b20: 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
9b30: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
9b40: 20 6d 78 50 61 67 65 29 3b 0a 20 20 72 65 74 75   mxPage);.  retu
9b50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9b60: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
9b70: 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
9b80: 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
9b90: 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
9ba0: 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
9bb0: 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
9bc0: 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
9bd0: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
9be0: 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
9bf0: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
9c00: 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
9c10: 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
9c20: 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
9c30: 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
9c40: 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
9c50: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
9c60: 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
9c70: 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
9c80: 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
9c90: 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
9ca0: 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
9cb0: 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
9cc0: 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
9cd0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
9ce0: 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
9cf0: 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
9d00: 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
9d10: 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
9d20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9d30: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
9d40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
9d50: 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
9d60: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65  Btree *p, int le
9d70: 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e  vel, int fullSyn
9d80: 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  c){.  BtShared *
9d90: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
9da0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
9db0: 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
9dc0: 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
9dd0: 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 72 65 74 75  ullSync);.  retu
9de0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9df0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
9e00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
9e10: 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
9e20: 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
9e30: 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
9e40: 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
9e50: 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
9e60: 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
9e70: 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
9e80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
9e90: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
9ea0: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
9eb0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
9ec0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  t;.  assert( pBt
9ed0: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
9ee0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
9ef0: 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
9f00: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  Bt->pPager);.}..
9f10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
9f20: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
9f30: 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
9f40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9f50: 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68  VACUUM)./*.** Ch
9f60: 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
9f70: 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20   pages size and 
9f80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
9f90: 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72  served bytes per
9fa0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
9fb0: 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
9fc0: 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
9fd0: 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
9fe0: 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
9ff0: 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
a000: 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
a010: 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
a020: 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
a030: 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
a040: 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
a050: 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
a060: 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
a070: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
a080: 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
a090: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
a0a0: 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
a0b0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
a0c0: 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
a0d0: 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
a0e0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
a0f0: 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
a100: 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
a110: 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
a120: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
a130: 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
a140: 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
a150: 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
a160: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
a170: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
a180: 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
a190: 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
a1a0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
a1b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
a1c0: 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
a1d0: 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
a1e0: 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
a1f0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
a200: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
a210: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
a220: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
a230: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
a240: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
a250: 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
a260: 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
a270: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
a280: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
a290: 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
a2a0: 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
a2b0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a2c0: 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
a2d0: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
a2e0: 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
a2f0: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
a300: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
a310: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
a320: 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
a330: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
a340: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73  Bt->pageSize = s
a350: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
a360: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
a370: 65 72 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  er, pageSize);. 
a380: 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65   }.  pBt->usable
a390: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
a3a0: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
a3b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a3c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
a3d0: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
a3e0: 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
a3f0: 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
a400: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
a410: 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
a420: 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
a430: 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20  pageSize;.}.int 
a440: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
a450: 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
a460: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
a470: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
a480: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
a4a0: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
a4b0: 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
a4c0: 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
a4d0: 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
a4e0: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
a4f0: 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
a500: 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
a510: 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
a520: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
a530: 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
a540: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
a550: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
a560: 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
a570: 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
a580: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74  t mxPage){.  ret
a590: 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  urn sqlite3Pager
a5a0: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
a5b0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
a5c0: 61 67 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  age);.}.#endif /
a5d0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
a5e0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
a5f0: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
a600: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
a610: 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
a620: 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
a630: 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
a640: 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
a650: 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
a660: 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
a670: 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
a680: 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
a690: 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
a6a0: 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
a6b0: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
a6c0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
a6d0: 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
a6e0: 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
a6f0: 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
a700: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
a710: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
a720: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
a730: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
a740: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
a750: 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
a760: 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
a770: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
a780: 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
a790: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
a7a0: 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
a7b0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
a7c0: 74 20 61 76 20 3d 20 28 61 75 74 6f 56 61 63 75  t av = (autoVacu
a7d0: 75 6d 3f 31 3a 30 29 3b 0a 20 20 69 6e 74 20 69  um?1:0);.  int i
a7e0: 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3d  v = (autoVacuum=
a7f0: 3d 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  =BTREE_AUTOVACUU
a800: 4d 5f 49 4e 43 52 3f 31 3a 30 29 3b 0a 20 20 69  M_INCR?1:0);.  i
a810: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
a820: 46 69 78 65 64 20 26 26 20 61 76 21 3d 70 42 74  Fixed && av!=pBt
a830: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
a840: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a850: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
a860: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
a870: 6d 20 3d 20 61 76 3b 0a 20 20 70 42 74 2d 3e 69  m = av;.  pBt->i
a880: 6e 63 72 56 61 63 75 75 6d 20 3d 20 69 76 3b 0a  ncrVacuum = iv;.
a890: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a8a0: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  OK;.#endif.}../*
a8b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
a8c0: 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
a8d0: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
a8e0: 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
a8f0: 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
a900: 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
a910: 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
a920: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
a930: 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
a940: 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
a950: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
a960: 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
a970: 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
a980: 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
a990: 72 65 74 75 72 6e 20 28 0a 20 20 20 20 28 21 70  return (.    (!p
a9a0: 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
a9b0: 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
a9c0: 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
a9d0: 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
a9e0: 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
a9f0: 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
aa00: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
aa10: 49 4e 43 52 0a 20 20 29 3b 0a 23 65 6e 64 69 66  INCR.  );.#endif
aa20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
aa30: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
aa40: 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
aa50: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
aa60: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
aa70: 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
aa80: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
aa90: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
aaa0: 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
aab0: 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
aac0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
aad0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
aae0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
aaf0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
ab00: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
ab10: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
ab20: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
ab30: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
ab40: 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
ab50: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
ab60: 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
ab70: 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
ab80: 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
ab90: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
aba0: 0a 20 20 69 6e 74 20 72 63 2c 20 70 61 67 65 53  .  int rc, pageS
abb0: 69 7a 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ize;.  MemPage *
abc0: 70 50 61 67 65 31 3b 0a 20 20 69 66 28 20 70 42  pPage1;.  if( pB
abd0: 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65 74 75  t->pPage1 ) retu
abe0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
abf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
ac00: 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
ac10: 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
ac20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ac30: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
ac40: 20 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20   ..  /* Do some 
ac50: 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
ac60: 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
ac70: 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
ac80: 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
ac90: 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
aca0: 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 53 51   .  */.  rc = SQ
acb0: 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 69  LITE_NOTADB;.  i
acc0: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
acd0: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
ace0: 61 67 65 72 29 3e 30 20 29 7b 0a 20 20 20 20 75  ager)>0 ){.    u
acf0: 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
ad00: 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  1->aData;.    if
ad10: 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
ad20: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
ad30: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
ad40: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
ad50: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
ad60: 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
ad70: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
ad80: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
ad90: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
ada0: 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
adb0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
adc0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
add0: 20 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32   pageSize = get2
ade0: 62 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29  byte(&page1[16])
adf0: 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  ;.    if( ((page
ae00: 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
ae10: 29 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65  )!=0 || pageSize
ae20: 3c 35 31 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  <512 ){.      go
ae30: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
ae40: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
ae50: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
ae60: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
ae70: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
ae80: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
ae90: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
aea0: 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
aeb0: 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
aec0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 35  Bt->usableSize<5
aed0: 30 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  00 ){.      goto
aee0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
aef0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
af00: 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 20  t->maxEmbedFrac 
af10: 3d 20 70 61 67 65 31 5b 32 31 5d 3b 0a 20 20 20  = page1[21];.   
af20: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
af30: 61 63 20 3d 20 70 61 67 65 31 5b 32 32 5d 3b 0a  ac = page1[22];.
af40: 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66      pBt->minLeaf
af50: 46 72 61 63 20 3d 20 70 61 67 65 31 5b 32 33 5d  Frac = page1[23]
af60: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
af70: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
af80: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
af90: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
afa0: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
afb0: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
afc0: 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
afd0: 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
afe0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
aff0: 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
b000: 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
b010: 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
b020: 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
b030: 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
b040: 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
b050: 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
b060: 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
b070: 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
b080: 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
b090: 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
b0a0: 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
b0b0: 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
b0c0: 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
b0d0: 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
b0e0: 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
b0f0: 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
b100: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
b110: 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
b120: 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
b130: 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
b140: 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
b150: 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
b160: 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
b170: 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
b180: 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20   2-byte poiner, 
b190: 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69  a header which i
b1a0: 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a  s as much as.  *
b1b0: 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c  * 17 bytes long,
b1c0: 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66   0 to N bytes of
b1d0: 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e   payload, and an
b1e0: 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65   optional 4 byte
b1f0: 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70   overflow.  ** p
b200: 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a  age pointer..  *
b210: 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  /.  pBt->maxLoca
b220: 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  l = (pBt->usable
b230: 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 61  Size-12)*pBt->ma
b240: 78 45 6d 62 65 64 46 72 61 63 2f 32 35 35 20 2d  xEmbedFrac/255 -
b250: 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
b260: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
b270: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d  bleSize-12)*pBt-
b280: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 2f 32 35  >minEmbedFrac/25
b290: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
b2a0: 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
b2b0: 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
b2c0: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
b2d0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
b2e0: 2d 31 32 29 2a 70 42 74 2d 3e 6d 69 6e 4c 65 61  -12)*pBt->minLea
b2f0: 66 46 72 61 63 2f 32 35 35 20 2d 20 32 33 3b 0a  fFrac/255 - 23;.
b300: 20 20 69 66 28 20 70 42 74 2d 3e 6d 69 6e 4c 6f    if( pBt->minLo
b310: 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  cal>pBt->maxLoca
b320: 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  l || pBt->maxLoc
b330: 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  al<0 ){.    goto
b340: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
b350: 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ed;.  }.  assert
b360: 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
b370: 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
b380: 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
b390: 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
b3a0: 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
b3b0: 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
b3c0: 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
b3d0: 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
b3e0: 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
b3f0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
b400: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
b410: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c   routine works l
b420: 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ike lockBtree() 
b430: 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 61  except that it a
b440: 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a  lso invokes the.
b450: 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ** busy callback
b460: 20 69 66 20 74 68 65 72 65 20 69 73 20 6c 6f 63   if there is loc
b470: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f  k contention..*/
b480: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
b490: 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 42  BtreeWithRetry(B
b4a0: 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20 20 69  tree *pRef){.  i
b4b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b4c0: 4b 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69  K;.  if( pRef->i
b4d0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
b4e0: 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54  NE ){.    u8 inT
b4f0: 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65  ransaction = pRe
b500: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
b510: 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65  ction;.    btree
b520: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
b530: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b540: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
b550: 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70  (pRef, 0);.    p
b560: 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
b570: 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e  saction = inTran
b580: 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65  saction;.    pRe
b590: 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  f->inTrans = TRA
b5a0: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28  NS_NONE;.    if(
b5b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b5c0: 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42  {.      pRef->pB
b5d0: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
b5e0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72  -;.    }.    btr
b5f0: 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
b600: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b610: 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f  rc;.}.       ../
b620: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
b630: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
b640: 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
b650: 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
b660: 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
b670: 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
b680: 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
b690: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
b6a0: 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
b6b0: 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
b6c0: 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
b6d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
b6e0: 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
b6f0: 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
b700: 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
b710: 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
b720: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
b730: 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
b740: 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ors, this routin
b750: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
b760: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
b770: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
b780: 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
b790: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
b7a0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
b7b0: 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
b7c0: 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
b7d0: 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74  *pBt){.  if( pBt
b7e0: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
b7f0: 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
b800: 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26  Bt->pCursor==0 &
b810: 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
b820: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
b830: 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
b840: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31  (pBt->pPager)>=1
b850: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42   ){.      if( pB
b860: 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
b870: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  ==0 ){.        M
b880: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
b890: 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
b8a0: 20 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74       pPage->aDat
b8b0: 61 20 3d 20 26 28 28 75 38 2a 29 70 50 61 67 65  a = &((u8*)pPage
b8c0: 29 5b 2d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )[-pBt->pageSize
b8d0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ];.        pPage
b8e0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
b8f0: 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
b900: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
b910: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
b920: 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
b930: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50 61    }.    pBt->pPa
b940: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ge1 = 0;.    pBt
b950: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
b960: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
b970: 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  e a new database
b980: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
b990: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
b9a0: 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e 0a  of the.** file..
b9b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
b9c0: 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
b9d0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
b9e0: 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
b9f0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
ba00: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
ba10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
ba20: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
ba30: 65 72 29 3e 30 20 29 20 72 65 74 75 72 6e 20 53  er)>0 ) return S
ba40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 31 20  QLITE_OK;.  pP1 
ba50: 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
ba60: 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
ba70: 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
ba80: 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
ba90: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
baa0: 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
bab0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
bac0: 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
bad0: 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
bae0: 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
baf0: 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
bb00: 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
bb10: 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
bb20: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
bb30: 5b 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53  [16], pBt->pageS
bb40: 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  ize);.  data[18]
bb50: 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
bb60: 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d   = 1;.  data[20]
bb70: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
bb80: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
bb90: 7a 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  ze;.  data[21] =
bba0: 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72   pBt->maxEmbedFr
bbb0: 61 63 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  ac;.  data[22] =
bbc0: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
bbd0: 61 63 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  ac;.  data[23] =
bbe0: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61   pBt->minLeafFra
bbf0: 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  c;.  memset(&dat
bc00: 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
bc10: 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
bc20: 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
bc30: 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
bc40: 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
bc50: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
bc60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bc70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
bc80: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
bc90: 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
bca0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
bcb0: 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
bcc0: 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
bcd0: 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
bce0: 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
bcf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
bd00: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
bd10: 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
bd20: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
bd30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
bd40: 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
bd50: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
bd60: 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
bd70: 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
bd80: 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
bd90: 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
bda0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
bdb0: 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
bdc0: 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
bdd0: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
bde0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
bdf0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
be00: 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
be10: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
be20: 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
be30: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
be40: 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
be50: 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
be60: 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
be70: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
be80: 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
be90: 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
bea0: 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
beb0: 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
bec0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
bed0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
bee0: 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
bef0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
bf00: 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
bf10: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
bf20: 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
bf30: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
bf40: 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
bf50: 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
bf60: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
bf70: 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
bf80: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
bf90: 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
bfa0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
bfb0: 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
bfc0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
bfd0: 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
bfe0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
bff0: 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
c000: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
c010: 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
c020: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
c030: 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
c040: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
c050: 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
c060: 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
c070: 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
c080: 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
c090: 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
c0a0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
c0b0: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
c0c0: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
c0d0: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
c0e0: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
c0f0: 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
c100: 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
c110: 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
c120: 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
c130: 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
c140: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
c150: 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
c160: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
c170: 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
c180: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
c190: 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
c1a0: 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
c1b0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
c1c0: 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
c1d0: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
c1e0: 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
c1f0: 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
c200: 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
c210: 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
c220: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
c230: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
c240: 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
c250: 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
c260: 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
c270: 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
c280: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
c290: 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
c2a0: 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
c2b0: 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
c2c0: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
c2d0: 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
c2e0: 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
c2f0: 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
c300: 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
c310: 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
c320: 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
c330: 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
c340: 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
c350: 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
c360: 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
c370: 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
c380: 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
c390: 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
c3a0: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
c3b0: 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
c3c0: 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
c3d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
c3e0: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
c3f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 62   SQLITE_OK;..  b
c400: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
c410: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
c420: 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
c430: 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
c440: 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
c450: 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
c460: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
c470: 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
c480: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
c490: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
c4a0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
c4b0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
c4c0: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
c4d0: 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
c4e0: 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
c4f0: 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
c500: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c510: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
c520: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
c530: 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
c540: 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
c550: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
c560: 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
c570: 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
c580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
c590: 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f  ADONLY;.  }..  /
c5a0: 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
c5b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
c5c0: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
c5d0: 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
c5e0: 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
c5f0: 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
c600: 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
c610: 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
c620: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
c630: 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
c640: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
c650: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   */.  if( pBt->i
c660: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
c670: 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72 66  ANS_WRITE && wrf
c680: 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
c690: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
c6a0: 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69   }..  do {.    i
c6b0: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
c6c0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
c6d0: 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 3b 0a  lockBtree(pBt);.
c6e0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
c6f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
c700: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
c710: 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
c720: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
c730: 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
c740: 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
c750: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c760: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
c770: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
c780: 61 67 65 2c 20 77 72 66 6c 61 67 3e 31 29 3b 0a  age, wrflag>1);.
c790: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
c7a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c7b0: 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
c7c0: 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
c7d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c7e0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
c7f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c800: 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  {.      if( wrfl
c810: 61 67 20 29 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ag ) pBt->inStmt
c820: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
c830: 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
c840: 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
c850: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
c860: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
c870: 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
c880: 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
c890: 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
c8a0: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
c8b0: 79 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 42  yHandler(pBt->pB
c8c0: 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 0a  usyHandler) );..
c8d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c8e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
c8f0: 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
c900: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
c910: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
c920: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ++;.    }.    p-
c930: 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
c940: 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
c950: 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
c960: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
c970: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
c980: 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
c990: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
c9a0: 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
c9b0: 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  }.  }..  btreeIn
c9c0: 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 72 65  tegrity(p);.  re
c9d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
c9e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c9f0: 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
ca00: 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
ca10: 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
ca20: 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
ca30: 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
ca40: 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
ca50: 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
ca60: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
ca70: 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
ca80: 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
ca90: 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
caa0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
cab0: 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
cac0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
cad0: 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
cae0: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
caf0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
cb20: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
cb30: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
cb50: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
cb60: 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
cb70: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
cba0: 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
cbb0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
cbc0: 70 42 74 3b 0a 20 20 69 6e 74 20 69 73 49 6e 69  pBt;.  int isIni
cbd0: 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
cbe0: 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
cbf0: 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
cc00: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
cc10: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
cc20: 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61  Page, pPage->pPa
cc30: 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21  rent);.  if( rc!
cc40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cc50: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
cc60: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
cc70: 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
cc80: 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
cc90: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
cca0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
ccb0: 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
ccc0: 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
ccd0: 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
cce0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
ccf0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
cd00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cd10: 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
cd20: 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
cd30: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
cd40: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
cd50: 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
cd60: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
cd70: 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
cd80: 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
cd90: 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
cda0: 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
cdb0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
cdc0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
cdd0: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
cde0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
cdf0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ce00: 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
ce10: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
ce20: 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
ce30: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
ce40: 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
ce50: 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
ce60: 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
ce70: 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
ce80: 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
ce90: 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
cea0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
ceb0: 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
cec0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ced0: 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
cee0: 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
cef0: 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  renteed to be a 
cf00: 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
cf10: 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
cf20: 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
cf30: 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
cf40: 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
cf50: 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
cf60: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
cf70: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
cf80: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
cf90: 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
cfa0: 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
cfb0: 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
cfc0: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
cfd0: 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
cfe0: 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
cff0: 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
d000: 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
d030: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
d040: 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
d050: 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
d060: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
d070: 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
d080: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
d090: 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
d0a0: 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
d0b0: 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
d0c0: 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
d0d0: 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
d0e0: 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
d0f0: 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
d100: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
d110: 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
d130: 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
d140: 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
d150: 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
d160: 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
d170: 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
d180: 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
d190: 20 65 54 79 70 65 29 7b 0a 20 20 69 66 28 20 65   eType){.  if( e
d1a0: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
d1b0: 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
d1c0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
d1d0: 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
d1e0: 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
d1f0: 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
d200: 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
d210: 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
d220: 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
d230: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d240: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d250: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
d260: 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
d270: 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
d280: 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74  {.    int isInit
d290: 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
d2a0: 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
d2b0: 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
d2c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
d2d0: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
d2e0: 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   0);.    nCell =
d2f0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
d300: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d310: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
d320: 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
d330: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
d340: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
d350: 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
d360: 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
d370: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
d380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
d390: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
d3a0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
d3b0: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
d3c0: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
d3d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
d3e0: 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
d3f0: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
d400: 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20  erflow]) ){.    
d410: 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
d420: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
d430: 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
d440: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
d450: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d460: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d470: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
d480: 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
d490: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
d4a0: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
d4b0: 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
d4c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d4d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d4e0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
d4f0: 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
d500: 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
d510: 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
d520: 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
d530: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
d540: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
d550: 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
d560: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d570: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d580: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d590: 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
d5a0: 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
d5b0: 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
d5c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
d5d0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
d5e0: 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
d5f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d600: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
d610: 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
d620: 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
d630: 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
d640: 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
d650: 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
d660: 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
d670: 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f  emains valid..*/
d680: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
d690: 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
d6a0: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
d6b0: 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
d6c0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
d6d0: 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
d6e0: 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
d6f0: 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d710: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
d720: 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
d730: 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
d740: 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
d750: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
d760: 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
d770: 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
d780: 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
d790: 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
d7a0: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
d7b0: 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
d7c0: 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
d7d0: 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
d7e0: 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
d7f0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
d800: 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
d810: 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
d820: 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
d830: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
d840: 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
d850: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
d860: 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
d870: 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
d880: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
d890: 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
d8a0: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
d8b0: 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
d8c0: 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
d8d0: 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
d8e0: 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
d8f0: 74 27 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  t's current loca
d900: 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
d910: 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
d920: 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
d930: 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
d940: 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
d950: 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
d960: 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
d970: 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
d980: 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
d990: 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
d9a0: 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
d9b0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
d9c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
d9d0: 46 72 65 65 50 61 67 65 29 3b 0a 20 20 69 66 28  FreePage);.  if(
d9e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d9f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
da00: 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
da10: 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
da20: 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
da30: 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
da40: 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
da50: 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
da60: 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
da70: 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
da80: 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
da90: 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
daa0: 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
dab0: 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
dac0: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
dad0: 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
dae0: 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
daf0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
db00: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
db10: 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
db20: 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
db30: 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
db40: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
db50: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
db60: 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
db70: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
db80: 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
db90: 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
dba0: 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
dbb0: 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
dbc0: 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
dbd0: 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
dbe0: 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
dbf0: 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
dc00: 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
dc10: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
dc20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dc30: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
dc40: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
dc50: 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
dc60: 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
dc70: 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
dc80: 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
dc90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
dca0: 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
dcb0: 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
dcc0: 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
dcd0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
dce0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
dcf0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
dd00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd10: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
dd20: 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
dd30: 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
dd40: 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
dd50: 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
dd60: 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
dd70: 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
dd80: 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
dd90: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
dda0: 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
ddb0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
ddc0: 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
ddd0: 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
dde0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
ddf0: 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
de00: 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
de10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
de20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
de30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
de40: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
de50: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
de60: 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
de70: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
de80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
de90: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
dea0: 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
deb0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
dec0: 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
ded0: 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
dee0: 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
def0: 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
df00: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
df10: 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
df20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
df30: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
df40: 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
df50: 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
df60: 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d  iPtrPage);.    }
df70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
df80: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
df90: 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
dfa0: 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
dfb0: 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
dfc0: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
dfd0: 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
dfe0: 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
dff0: 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
e000: 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
e010: 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
e020: 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
e030: 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
e040: 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65  uccessful,.** re
e050: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
e060: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
e070: 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
e080: 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70  herefore no.** p
e090: 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20  oint in calling 
e0a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
e0b0: 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
e0c0: 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
e0d0: 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c  More specificly,
e0e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
e0f0: 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72  ttempts to re-or
e100: 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64  ganize the .** d
e110: 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20  atabase so that 
e120: 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66  the last page of
e130: 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e   the file curren
e140: 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73  tly in use.** is
e150: 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
e160: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
e170: 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69  nFin parameter i
e180: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
e190: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61  implementation a
e1a0: 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
e1b0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
e1c0: 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
e1d0: 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
e1e0: 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
e1f0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
e200: 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
e210: 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
e220: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
e230: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
e240: 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
e250: 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
e260: 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
e270: 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ete..*/.static i
e280: 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
e290: 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
e2a0: 20 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50   Pgno nFin){.  P
e2b0: 67 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20  gno iLastPg;    
e2c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
e2d0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
e2e0: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
e2f0: 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
e300: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e310: 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
e320: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
e330: 2f 0a 0a 20 20 69 4c 61 73 74 50 67 20 3d 20 70  /..  iLastPg = p
e340: 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 69 66  Bt->nTrunc;.  if
e350: 28 20 69 4c 61 73 74 50 67 3d 3d 30 20 29 7b 0a  ( iLastPg==0 ){.
e360: 20 20 20 20 69 4c 61 73 74 50 67 20 3d 20 73 71      iLastPg = sq
e370: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
e380: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
e390: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 50 54  ;.  }..  if( !PT
e3a0: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
e3b0: 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
e3c0: 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
e3d0: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
e3e0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
e3f0: 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
e400: 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
e410: 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
e420: 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
e430: 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
e440: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
e450: 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69  st==0 || nFin==i
e460: 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20  LastPg ){.      
e470: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
e480: 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
e490: 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
e4a0: 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
e4b0: 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
e4c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e4d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
e4e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e4f0: 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
e500: 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
e510: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
e520: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e530: 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
e540: 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
e550: 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
e560: 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29     if( nFin==0 )
e570: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
e580: 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
e590: 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
e5a0: 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
e5b0: 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
e5c0: 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69      ** if nFin i
e5d0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
e5e0: 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
e5f0: 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
e600: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
e610: 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
e620: 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
e630: 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
e640: 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
e650: 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
e660: 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
e670: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
e680: 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
e690: 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
e6a0: 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
e6b0: 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
e6c0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
e6d0: 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
e6e0: 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
e6f0: 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
e700: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
e710: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e720: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
e730: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
e740: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
e750: 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
e760: 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
e770: 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
e780: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
e790: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
e7a0: 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
e7b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
e7c0: 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
e7d0: 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
e7e0: 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
e7f0: 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20  ge *pLastPg;..  
e800: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e810: 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
e820: 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
e830: 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
e840: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e850: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
e860: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
e870: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e        /* If nFin
e880: 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
e890: 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
e8a0: 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
e8b0: 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
e8c0: 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
e8d0: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
e8e0: 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
e8f0: 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
e900: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
e910: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
e920: 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72  d, if nFin is gr
e930: 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
e940: 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
e950: 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
e960: 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
e970: 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
e980: 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
e990: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
e9a0: 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
e9b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e9c0: 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
e9d0: 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
e9e0: 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
e9f0: 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
ea00: 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
ea10: 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  reePg, 0, 0);.  
ea20: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ea30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ea40: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
ea50: 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
ea60: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
ea70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ea80: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
ea90: 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
eaa0: 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26  hile( nFin!=0 &&
eab0: 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
eac0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
ead0: 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
eae0: 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
eaf0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
eb00: 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70  Write(pLastPg->p
eb10: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
eb20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
eb30: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
eb40: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 20 0a  rn rc;.      } .
eb50: 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
eb60: 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61  atePage(pBt, pLa
eb70: 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74  stPg, eType, iPt
eb80: 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 29 3b  rPage, iFreePg);
eb90: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
eba0: 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
ebb0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ebc0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ebd0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
ebe0: 20 7d 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   } .    }.  }.. 
ebf0: 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69   pBt->nTrunc = i
ec00: 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68  LastPg - 1;.  wh
ec10: 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63  ile( pBt->nTrunc
ec20: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
ec30: 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50  AGE(pBt)||PTRMAP
ec40: 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
ec50: 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20  ->nTrunc) ){.   
ec60: 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a   pBt->nTrunc--;.
ec70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
ec80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ec90: 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
eca0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
ecb0: 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
ecc0: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
ecd0: 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
ece0: 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
ecf0: 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
ed00: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
ed10: 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
ed20: 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
ed30: 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
ed40: 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
ed50: 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
ed60: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
ed70: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
ed80: 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
ed90: 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
eda0: 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  ccured,.** SQLIT
edb0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
edc0: 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
edd0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
ede0: 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
edf0: 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
ee00: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
ee10: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
ee20: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
ee30: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
ee40: 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
ee50: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
ee60: 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
ee70: 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
ee80: 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75  cuum ){.    retu
ee90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
eea0: 20 20 7d 0a 20 20 69 6e 76 61 6c 69 64 61 74 65    }.  invalidate
eeb0: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
eec0: 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pBt);.  return 
eed0: 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
eee0: 42 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Bt, 0);.}../*.**
eef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ef00: 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
ef10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
ef20: 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
ef30: 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
ef40: 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
ef50: 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
ef60: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
ef70: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
ef80: 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
ef90: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
efa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
efb0: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
efc0: 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
efd0: 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
efe0: 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
eff0: 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
f000: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
f010: 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
f020: 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
f030: 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
f040: 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
f050: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
f060: 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
f070: 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
f080: 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e  Bt, Pgno *pnTrun
f090: 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
f0a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
f0b0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
f0c0: 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e 64 65 66  >pPager;.#ifndef
f0d0: 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 52   NDEBUG.  int nR
f0e0: 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
f0f0: 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
f100: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 76  );.#endif..  inv
f110: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
f120: 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
f130: 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
f140: 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
f150: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
f160: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
f170: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
f180: 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b  Bt->nTrunc==0 ){
f190: 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  .      Pgno nFre
f1a0: 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  e;.      Pgno nP
f1b0: 74 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e  trmap;.      con
f1c0: 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  st int pgsz = pB
f1d0: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  t->pageSize;.   
f1e0: 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
f1f0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
f200: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
f210: 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 50  r);..      if( P
f220: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
f230: 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20  , nOrig) ){.    
f240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f250: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f270: 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  ( nOrig==PENDING
f280: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
f290: 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69 67  ){.        nOrig
f2a0: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
f2b0: 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
f2c0: 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
f2d0: 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
f2e0: 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
f2f0: 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
f300: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
f310: 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73  ig)+pgsz/5)/(pgs
f320: 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e  z/5);.      nFin
f330: 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
f340: 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20   - nPtrmap;.    
f350: 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
f360: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
f370: 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44  t) && nFin<=PEND
f380: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
f390: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46  t) ){.        nF
f3a0: 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  in--;.      }.  
f3b0: 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
f3c0: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
f3d0: 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
f3e0: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
f3f0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Bt) ){.        n
f400: 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Fin--;.      }. 
f410: 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28     }..    while(
f420: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f430: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
f440: 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
f450: 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   nFin);.    }.  
f460: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f470: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 61  _DONE ){.      a
f480: 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c  ssert(nFin==0 ||
f490: 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20   pBt->nTrunc==0 
f4a0: 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54  || nFin<=pBt->nT
f4b0: 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63 20  runc);.      rc 
f4c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
f4d0: 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75     if( pBt->nTru
f4e0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nc ){.        sq
f4f0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
f500: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
f510: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
f520: 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
f530: 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
f540: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74   0);.        put
f550: 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
f560: 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
f570: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
f580: 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20  nTrunc = nFin;. 
f590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f5a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f5b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
f5c0: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
f5d0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
f5e0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
f5f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f600: 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e  *pnTrunc = pBt->
f610: 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d  nTrunc;.    pBt-
f620: 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d  >nTrunc = 0;.  }
f630: 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d  .  assert( nRef=
f640: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
f650: 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
f660: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f670: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
f680: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
f690: 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
f6a0: 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
f6b0: 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
f6c0: 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
f6d0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
f6e0: 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
f6f0: 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
f700: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
f710: 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
f720: 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
f730: 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
f740: 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
f750: 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
f760: 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
f770: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
f780: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
f790: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
f7a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
f7b0: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
f7c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f7d0: 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
f7e0: 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
f7f0: 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
f800: 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
f810: 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
f820: 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
f830: 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
f840: 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
f850: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
f860: 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
f870: 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
f880: 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
f890: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
f8a0: 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
f8b0: 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
f8c0: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
f8d0: 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
f8e0: 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
f8f0: 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
f900: 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
f910: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
f920: 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
f930: 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
f940: 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
f950: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
f960: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
f970: 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
f980: 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
f990: 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
f9a0: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
f9b0: 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
f9c0: 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
f9d0: 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
f9e0: 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
f9f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
fa00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
fa10: 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
fa20: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
fa30: 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
fa40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
fa50: 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
fa60: 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
fa70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
fa80: 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
fa90: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
faa0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
fab0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
fac0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
fad0: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
fae0: 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
faf0: 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
fb00: 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
fb10: 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
fb20: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
fb30: 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
fb40: 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
fb50: 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
fb60: 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
fb70: 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
fb80: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
fb90: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
fba0: 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
fbb0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
fbc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
fbd0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
fbe0: 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
fbf0: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
fc00: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
fc10: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
fc20: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
fc30: 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
fc40: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
fc50: 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54  pBt;.    Pgno nT
fc60: 72 75 6e 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65  runc = 0;.#ifnde
fc70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fc80: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
fc90: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
fca0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
fcb0: 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
fcc0: 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a  pBt, &nTrunc); .
fcd0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
fce0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fcf0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fd00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
fd10: 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
fd20: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
fd30: 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
fd40: 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  er, zMaster, nTr
fd50: 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  unc);.  }.  retu
fd60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fd70: 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
fd80: 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
fd90: 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
fda0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fdb0: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
fdc0: 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
fdd0: 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
fde0: 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
fdf0: 33 42 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75  3BtreeSync() rou
fe00: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
fe10: 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
fe20: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a  ould be invoked.
fe30: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
fe40: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
fe50: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
fe60: 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e  reeSync() routin
fe70: 65 20 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65  e did.** all the
fe80: 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
fe90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
fea0: 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
feb0: 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
fec0: 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
fed0: 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
fee0: 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
fef0: 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
ff00: 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
ff10: 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
ff20: 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 72  r truncate the r
ff30: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a  ollback journal.
ff40: 2a 2a 20 28 77 68 69 63 68 20 63 61 75 73 65 73  ** (which causes
ff50: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ff60: 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20   to commit) and 
ff70: 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
ff80: 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
ff90: 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
ffa0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
ffb0: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
ffc0: 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
ffd0: 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
ffe0: 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
fff0: 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
10000 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10010 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
10020 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
10030 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10040 42 74 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  Bt;..  btreeInte
10050 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
10060 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
10070 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
10080 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
10090 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
100a0 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
100b0 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
100c0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
100d0 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
100e0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
100f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
10100 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
10110 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
10120 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
10130 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
10140 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
10150 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
10160 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
10170 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
10180 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
10190 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
101a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
101b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
101c0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
101d0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
101e0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42  ANS_READ;.    pB
101f0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
10200 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   }.  unlockAllTa
10210 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  bles(p);..  /* I
10220 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
10230 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
10240 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
10250 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61  ecrement the tra
10260 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
10270 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
10280 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
10290 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
102a0 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  t reaches 0, set
102b0 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64  .  ** the shared
102c0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
102d0 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
102e0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20  BtreeIfUnused() 
102f0 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20  call below.  ** 
10300 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
10310 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  pager..  */.  if
10320 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
10330 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
10340 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
10350 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
10360 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
10370 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
10380 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
10390 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
103a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
103b0 74 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72  the handles curr
103c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
103d0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
103e0 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20  ONE and unlock. 
103f0 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66   ** the pager if
10400 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
10410 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
10420 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
10430 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  tion..  */.  p->
10440 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
10450 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  NONE;.  unlockBt
10460 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
10470 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
10480 69 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ity(p);.  return
10490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
104a0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
104b0 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
104c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
104d0 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
104e0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
104f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10500 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
10510 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
10520 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10530 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10540 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
10550 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  Two(p);.  }.  re
10560 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
10570 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
10580 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
10590 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
105a0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
105b0 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
105c0 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
105d0 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
105e0 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
105f0 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
10600 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
10610 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
10620 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74  ic int countWrit
10630 65 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  eCursors(BtShare
10640 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
10650 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
10660 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
10670 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
10680 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
10690 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
106a0 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
106b0 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
106c0 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
106d0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
106e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
106f0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
10700 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
10710 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
10720 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
10730 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
10740 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
10750 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
10760 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
10770 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
10780 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
10790 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
107a0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
107b0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
107c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
107d0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
107e0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
107f0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
10800 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
10810 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
10820 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10830 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
10840 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
10850 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10860 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
10870 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
10880 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
10890 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
108a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
108b0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
108c0 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
108d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
108e0 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
108f0 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
10900 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
10910 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
10920 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
10930 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
10940 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
10950 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
10960 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
10970 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
10980 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
10990 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
109a0 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
109b0 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
109c0 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
109d0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
109e0 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
109f0 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
10a00 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
10a10 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
10a20 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
10a30 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
10a40 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
10a50 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
10a60 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
10a70 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
10a80 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
10a90 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
10aa0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
10ab0 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
10ac0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
10ad0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 2d 3e 70   pBt->pCursor->p
10ae0 42 74 72 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a  Btree->pSqlite;.
10af0 20 20 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a        if( db ){.
10b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 41          sqlite3A
10b10 62 6f 72 74 4f 74 68 65 72 41 63 74 69 76 65 56  bortOtherActiveV
10b20 64 62 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  dbes(db, 0);.   
10b30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
10b40 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
10b50 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c  egrity(p);.  unl
10b60 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
10b70 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
10b80 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
10b90 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
10ba0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10bb0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
10bc0 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
10bd0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
10be0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
10bf0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
10c00 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
10c10 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
10c20 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
10c30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
10c40 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
10c50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
10c60 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
10c70 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
10c80 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
10c90 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
10ca0 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
10cb0 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65    ** call sqlite
10cc0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
10cd0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
10ce0 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
10cf0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
10d00 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
10d10 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ly. */.    if( s
10d20 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
10d30 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
10d40 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
10d50 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
10d60 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
10d70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
10d80 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
10d90 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
10da0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
10db0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
10dc0 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  AD;.  }..  if( p
10dd0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
10de0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73  _NONE ){.    ass
10df0 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
10e00 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
10e10 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
10e20 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
10e30 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
10e40 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
10e50 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
10e60 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
10e70 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72  }.  }..  p->inTr
10e80 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
10e90 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  ;.  pBt->inStmt 
10ea0 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  = 0;.  unlockBtr
10eb0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
10ec0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
10ed0 74 79 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ty(p);.  return 
10ee0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
10ef0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
10f00 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  ubtransaction.  
10f10 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
10f20 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62 65  on can.** can be
10f30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 64   rolled back ind
10f40 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
10f50 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
10f60 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74 20  on..** You must 
10f70 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
10f80 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72 74  ion before start
10f90 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
10fa0 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75 62  tion..** The sub
10fb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
10fc0 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
10fd0 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ly if the main t
10fe0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63 6f  ransaction.** co
10ff0 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
11000 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ack..**.** Only 
11010 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  one subtransacti
11020 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
11030 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74 20   at a time.  It 
11040 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 74  is an error to t
11050 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20 61  ry.** to start a
11060 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63 74   new subtransact
11070 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20 73  ion if another s
11080 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
11090 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
110a0 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
110b0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
110c0 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
110d0 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
110e0 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
110f0 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
11100 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
11110 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
11120 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
11130 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
11140 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
11150 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
11160 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
11170 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
11180 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
11190 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
111a0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
111b0 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
111c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
111d0 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
111e0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
111f0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
11200 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
11210 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  f( (p->inTrans!=
11220 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
11230 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20  pBt->inStmt ){. 
11240 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
11250 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
11260 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
11270 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
11280 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
11290 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
112a0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 72 63 20  S_WRITE );.  rc 
112b0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
112c0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
112d0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
112e0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 29  gin(pBt->pPager)
112f0 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  ;.  pBt->inStmt 
11300 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
11310 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  ;.}.../*.** Comm
11320 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20  it the statment 
11330 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
11340 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
11350 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20  ress.  If no.** 
11360 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
11370 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20 69  s active, this i
11380 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
11390 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
113a0 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a  mmitStmt(Btree *
113b0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
113c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
113d0 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
113e0 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
113f0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
11400 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
11410 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
11420 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d  Bt->pPager);.  }
11430 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
11440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
11450 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
11460 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11470 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
11480 74 68 65 20 61 63 74 69 76 65 20 73 74 61 74 65  the active state
11490 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
114a0 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73 75 62 74  ion.  If no subt
114b0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
114c0 20 61 63 74 69 76 65 20 74 68 69 73 20 72 6f 75   active this rou
114d0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
114e0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f  .**.** All curso
114f0 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
11500 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20 6f  idated by this o
11510 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
11520 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65  ttempt.** to use
11530 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 77   a cursor that w
11540 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
11550 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
11560 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69   operation.** wi
11570 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
11580 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  error..*/.int sq
11590 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
115a0 63 6b 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  ckStmt(Btree *p)
115b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
115c0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
115d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
115e0 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ;.  sqlite3Mallo
115f0 63 44 69 73 61 6c 6c 6f 77 28 29 3b 0a 20 20 69  cDisallow();.  i
11600 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26  f( pBt->inStmt &
11610 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  & !pBt->readOnly
11620 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11630 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
11640 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
11650 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
11660 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
11670 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
11680 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
11690 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4d  ;.  }.  sqlite3M
116a0 61 6c 6c 6f 63 41 6c 6c 6f 77 28 29 3b 0a 20 20  allocAllow();.  
116b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
116c0 0a 2a 2a 20 44 65 66 61 75 6c 74 20 6b 65 79 20  .** Default key 
116d0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
116e0 69 6f 6e 20 74 6f 20 62 65 20 75 73 65 64 20 69  ion to be used i
116f0 66 20 6e 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  f no comparison 
11700 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  function.** is s
11710 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20  pecified on the 
11720 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
11730 6f 72 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  or() call..*/.st
11740 61 74 69 63 20 69 6e 74 20 64 66 6c 74 43 6f 6d  atic int dfltCom
11750 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  pare(.  void *No
11760 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 20 20  tUsed,          
11770 20 20 20 2f 2a 20 55 73 65 72 20 64 61 74 61 20     /* User data 
11780 69 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  is not used */. 
11790 20 69 6e 74 20 6e 31 2c 20 63 6f 6e 73 74 20 76   int n1, const v
117a0 6f 69 64 20 2a 70 31 2c 20 20 20 20 2f 2a 20 46  oid *p1,    /* F
117b0 69 72 73 74 20 6b 65 79 20 74 6f 20 63 6f 6d 70  irst key to comp
117c0 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 32 2c  are */.  int n2,
117d0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 32 20   const void *p2 
117e0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6b 65      /* Second ke
117f0 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  y to compare */.
11800 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20  ){.  int c;.  c 
11810 3d 20 6d 65 6d 63 6d 70 28 70 31 2c 20 70 32 2c  = memcmp(p1, p2,
11820 20 6e 31 3c 6e 32 20 3f 20 6e 31 20 3a 20 6e 32   n1<n2 ? n1 : n2
11830 29 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  );.  if( c==0 ){
11840 0a 20 20 20 20 63 20 3d 20 6e 31 20 2d 20 6e 32  .    c = n1 - n2
11850 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
11860 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
11870 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
11880 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
11890 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
118a0 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
118b0 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61 63  .  The act of ac
118c0 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f 72  quiring a cursor
118d0 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f 63   gets a read loc
118e0 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74  k on .** the dat
118f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
11900 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20  * If wrFlag==0, 
11910 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
11920 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
11930 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a   for reading..**
11940 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74   If wrFlag==1, t
11950 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
11960 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
11970 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a  eading or for.**
11980 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
11990 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
119a0 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73   writing are als
119b0 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a  o met.  These.**
119c0 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
119d0 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
119e0 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f   met in order fo
119f0 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  r writing to.** 
11a00 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
11a10 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
11a20 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
11a30 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
11a40 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  ag==1.**.** 2:  
11a50 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
11a60 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
11a70 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
11a80 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
11a90 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
11aa0 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
11ab0 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
11ac0 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
11ad0 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
11ae0 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
11af0 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
11b00 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
11b10 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
11b20 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
11b30 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
11b40 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
11b50 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
11b60 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
11b70 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
11b80 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
11b90 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
11ba0 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
11bb0 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
11bc0 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
11bd0 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
11be0 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
11bf0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
11c00 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
11c10 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
11c20 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
11c30 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
11c40 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
11c50 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
11c60 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
11c70 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
11c80 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
11c90 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
11ca0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 61 72 69  *.** The compari
11cb0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  son function mus
11cc0 74 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79 20 74  t be logically t
11cd0 68 65 20 73 61 6d 65 20 66 6f 72 20 65 76 65 72  he same for ever
11ce0 79 20 63 75 72 73 6f 72 0a 2a 2a 20 6f 6e 20 61  y cursor.** on a
11cf0 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
11d00 65 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  e.  Changing the
11d10 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
11d20 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
11d30 0a 2a 2a 20 69 6e 20 69 6e 63 6f 72 72 65 63 74  .** in incorrect
11d40 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 49 66   operations.  If
11d50 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
11d60 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
11d70 2c 20 61 0a 2a 2a 20 64 65 66 61 75 6c 74 20 63  , a.** default c
11d80 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
11d90 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 54 68 65  on is used.  The
11da0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
11db0 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 6c 77 61 79  tion is.** alway
11dc0 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 49 4e  s ignored for IN
11dd0 54 4b 45 59 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a  TKEY tables..*/.
11de0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11df0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
11e00 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
11e30 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
11e40 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
11e70 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
11e80 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
11e90 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
11ec0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
11ed0 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76  .  int (*xCmp)(v
11ee0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
11ef0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
11f00 6f 69 64 2a 29 2c 20 2f 2a 20 4b 65 79 20 43 6f  oid*), /* Key Co
11f10 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 20 2a 2f  mparison func */
11f20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 20 20  .  void *pArg,  
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f50 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
11f60 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
11f70 74 43 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 20  tCursor **ppCur 
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
11fa0 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
11fb0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
11fc0 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
11fd0 70 43 75 72 3b 0a 20 20 42 74 53 68 61 72 65 64  pCur;.  BtShared
11fe0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11ff0 0a 20 20 2a 70 70 43 75 72 20 3d 20 30 3b 0a 20  .  *ppCur = 0;. 
12000 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
12010 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
12020 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65  Only ){.      re
12030 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
12040 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
12050 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63  if( checkReadLoc
12060 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 29  ks(p, iTable, 0)
12070 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
12080 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
12090 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
120a0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
120b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  ){.    rc = lock
120c0 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
120d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
120e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
120f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12100 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
12110 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c  readOnly && wrFl
12120 61 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ag ){.      retu
12130 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
12140 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LY;.    }.  }.  
12150 70 43 75 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pCur = sqliteMal
12160 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 75  loc( sizeof(*pCu
12170 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
12180 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
12190 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
121a0 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75    goto create_cu
121b0 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a  rsor_exception;.
121c0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
121d0 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
121e0 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c  ble;.  if( iTabl
121f0 65 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 50  e==1 && sqlite3P
12200 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
12210 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b  t->pPager)==0 ){
12220 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
12230 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f  _EMPTY;.    goto
12240 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
12250 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  xception;.  }.  
12260 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
12270 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
12280 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
12290 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
122a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
122b0 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  {.    goto creat
122c0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
122d0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  on;.  }..  /* No
122e0 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
122f0 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
12300 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
12310 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
12320 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c  .  ** variables,
12330 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
12340 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
12350 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20  ed list and set 
12360 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a  *ppCur (the.  **
12370 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74   output argument
12380 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
12390 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  n)..  */.  pCur-
123a0 3e 78 43 6f 6d 70 61 72 65 20 3d 20 78 43 6d 70  >xCompare = xCmp
123b0 20 3f 20 78 43 6d 70 20 3a 20 64 66 6c 74 43 6f   ? xCmp : dfltCo
123c0 6d 70 61 72 65 3b 0a 20 20 70 43 75 72 2d 3e 70  mpare;.  pCur->p
123d0 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 70 43  Arg = pArg;.  pC
123e0 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
123f0 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
12400 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d   wrFlag;.  pCur-
12410 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
12420 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
12430 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
12440 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
12450 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
12460 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
12470 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
12480 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
12490 56 41 4c 49 44 3b 0a 20 20 2a 70 70 43 75 72 20  VALID;.  *ppCur 
124a0 3d 20 70 43 75 72 3b 0a 0a 20 20 72 65 74 75 72  = pCur;..  retur
124b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 63 72 65  n SQLITE_OK;.cre
124c0 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
124d0 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75 72  tion:.  if( pCur
124e0 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
124f0 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
12500 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
12510 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 75 6e  (pCur);.  }.  un
12520 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
12530 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  d(pBt);.  return
12540 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
12550 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
12560 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
12570 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12580 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
12590 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
125a0 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
125b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
125c0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
125d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
125e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
125f0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d   = pCur->pBtree-
12600 3e 70 42 74 3b 0a 20 20 63 6c 65 61 72 43 75 72  >pBt;.  clearCur
12610 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
12620 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  );.  if( pCur->p
12630 50 72 65 76 20 29 7b 0a 20 20 20 20 70 43 75 72  Prev ){.    pCur
12640 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
12650 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
12660 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
12670 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
12680 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
12690 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
126a0 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
126b0 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
126c0 50 72 65 76 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  Prev;.  }.  rele
126d0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50  asePage(pCur->pP
126e0 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  age);.  unlockBt
126f0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
12700 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ;.  invalidateOv
12710 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
12720 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
12730 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
12740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12750 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f  .** Make a tempo
12760 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20 66  rary cursor by f
12770 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69  illing in the fi
12780 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72  elds of pTempCur
12790 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61  ..** The tempora
127a0 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  ry cursor is not
127b0 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c   on the cursor l
127c0 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72 65  ist for the Btre
127d0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
127e0 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
127f0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
12800 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  Cur, BtCursor *p
12810 54 65 6d 70 43 75 72 29 7b 0a 20 20 6d 65 6d 63  TempCur){.  memc
12820 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75  py(pTempCur, pCu
12830 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29  r, sizeof(*pCur)
12840 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70  );.  pTempCur->p
12850 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d  Next = 0;.  pTem
12860 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b  pCur->pPrev = 0;
12870 0a 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d  .  if( pTempCur-
12880 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71  >pPage ){.    sq
12890 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54  lite3PagerRef(pT
128a0 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70  empCur->pPage->p
128b0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
128c0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74  /*.** Delete a t
128d0 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
128e0 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65  such as was made
128f0 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65   by the CreateTe
12900 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a  mporaryCursor().
12910 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  ** function abov
12920 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12930 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
12940 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
12950 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
12960 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
12970 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
12980 6e 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65  nref(pCur->pPage
12990 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
129a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 47 45 54  }../*.** The GET
129b0 5f 43 45 4c 4c 5f 49 4e 46 4f 28 29 20 6d 61 63  _CELL_INFO() mac
129c0 72 6f 2e 20 54 61 6b 65 73 20 6f 6e 65 20 61 72  ro. Takes one ar
129d0 67 75 6d 65 6e 74 2c 20 61 20 70 6f 69 6e 74 65  gument, a pointe
129e0 72 20 74 6f 20 61 20 76 61 6c 69 64 0a 2a 2a 20  r to a valid.** 
129f0 62 74 72 65 65 20 63 75 72 73 6f 72 20 28 74 79  btree cursor (ty
12a00 70 65 20 42 74 43 75 72 73 6f 72 2a 29 2e 20 20  pe BtCursor*).  
12a10 54 68 69 73 20 6d 61 63 72 6f 20 6d 61 6b 65 73  This macro makes
12a20 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
12a30 6f 72 2e 69 6e 66 6f 0a 2a 2a 20 66 69 65 6c 64  or.info.** field
12a40 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 75   of the given cu
12a50 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
12a60 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
12a70 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
12a80 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
12a90 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
12aa0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
12ab0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
12ac0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
12ad0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
12ae0 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
12af0 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
12b00 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
12b10 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
12b20 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
12b30 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f  eParseCell()..*/
12b40 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
12b50 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
12b60 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
12b70 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
12b80 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
12b90 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
12ba0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
12bb0 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
12bc0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
12bd0 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
12be0 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  ->idx, &info);. 
12bf0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
12c00 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
12c10 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
12c20 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
12c30 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
12c40 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
12c50 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
12c60 47 45 54 5f 43 45 4c 4c 5f 49 4e 46 4f 28 70 43  GET_CELL_INFO(pC
12c70 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
12c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ca0 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
12cb0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 20 20 20  fo.nSize==0 )   
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
12cf0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
12d00 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
12d10 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70  e, pCur->idx, &p
12d20 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20  Cur->info);     
12d30 20 20 20 20 5c 0a 20 20 65 6c 73 65 20 20 20 20      \.  else    
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
12d80 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
12d90 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 0a 0a 2f  fo(pCur);.   ../
12da0 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
12db0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
12dc0 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
12dd0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
12de0 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
12df0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
12e00 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
12e10 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
12e20 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
12e30 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
12e40 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
12e50 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
12e60 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
12e70 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
12e80 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
12e90 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
12ea0 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
12eb0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
12ec0 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  the key..*/.int 
12ed0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
12ee0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
12ef0 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
12f00 0a 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 74  .  int rc = rest
12f10 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
12f20 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
12f30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
12f50 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
12f60 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
12f70 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
12f80 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
12f90 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
12fa0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
12fb0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2a  VALID ){.      *
12fc0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pSize = 0;.    }
12fd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 47 45 54 5f  else{.      GET_
12fe0 43 45 4c 4c 5f 49 4e 46 4f 28 70 43 75 72 29 3b  CELL_INFO(pCur);
12ff0 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
13000 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
13010 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
13020 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13030 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
13040 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
13050 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
13060 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
13070 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
13080 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61  points to.  Alwa
13090 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ys return SQLITE
130a0 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20  _OK..** Failure 
130b0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
130c0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
130d0 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
130e0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
130f0 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20  an entry (which 
13100 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20  can happen, for 
13110 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74  example, if.** t
13120 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
13130 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a  mpty) then *pSiz
13140 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  e is set to 0..*
13150 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13160 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
13170 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
13180 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
13190 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
131a0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
131b0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
131c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
131d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
131e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
131f0 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
13200 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
13210 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ALID );.    if( 
13220 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
13230 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
13240 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69        /* Not poi
13250 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64  nting at a valid
13260 20 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53   entry - set *pS
13270 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20  ize to 0. */.   
13280 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
13290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
132a0 47 45 54 5f 43 45 4c 4c 5f 49 4e 46 4f 28 70 43  GET_CELL_INFO(pC
132b0 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
132c0 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
132d0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
132e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
132f0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
13300 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
13310 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
13320 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
13330 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
13340 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
13350 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
13360 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
13370 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
13380 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
13390 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
133a0 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
133b0 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
133c0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
133d0 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
133e0 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
133f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
13400 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
13410 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
13420 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
13430 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
13440 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
13450 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
13460 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78 74  Unless pPgnoNext
13470 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61   is NULL, the pa
13480 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
13490 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a   next overflow .
134a0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ** page in the l
134b0 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77 72  inked list is wr
134c0 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
134d0 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
134e0 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74  l.** is the last
134f0 20 70 61 67 65 20 69 6e 20 69 74 27 73 20 6c 69   page in it's li
13500 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e  nked list, *pPgn
13510 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
13520 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
13530 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
13540 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73  LL, *ppPage is s
13550 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  et to the MemPag
13560 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72  e* handle.** for
13570 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20   page ovfl. The 
13580 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72  underlying pager
13590 20 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62   page may have b
135a0 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  een requested.**
135b0 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74   with the noCont
135c0 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f  ent flag set, so
135d0 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61   the page data a
135e0 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a  ccessable via.**
135f0 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79   this handle may
13600 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e   not be trusted.
13610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
13620 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
13630 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
13640 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20   .  Pgno ovfl,  
13650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13660 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
13670 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
13680 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
13690 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
136a0 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  age handle */.  
136b0 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
136c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
136d0 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
136e0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
136f0 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
13700 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
13710 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  .  /* One of the
13720 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 4e  se must not be N
13730 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ULL. Otherwise, 
13740 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75  why call this fu
13750 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73  nction? */.  ass
13760 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20 70 50  ert(ppPage || pP
13770 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a 20  gnoNext);..  /* 
13780 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  If pPgnoNext is 
13790 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
137a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
137b0 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  g called to obta
137c0 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61 67  in.  ** a MemPag
137d0 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  e* reference onl
137e0 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74 61 20  y. No page-data 
137f0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
13800 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  his case..  */. 
13810 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78 74 20   if( !pPgnoNext 
13820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
13830 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
13840 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70 50  e(pBt, ovfl, ppP
13850 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69  age, 1);.  }..#i
13860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13870 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
13880 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
13890 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
138a0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
138b0 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
138c0 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
138d0 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
138e0 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
138f0 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
13900 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
13910 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
13920 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
13930 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
13940 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
13950 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
13960 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
13970 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
13980 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
13990 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
139a0 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
139b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
139c0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
139d0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
139e0 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
139f0 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
13a00 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
13a10 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
13a20 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
13a30 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
13a40 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
13a50 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
13a60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
13a70 20 69 47 75 65 73 73 3c 3d 73 71 6c 69 74 65 33   iGuess<=sqlite3
13a80 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
13a90 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
13aa0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
13ab0 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
13ac0 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
13ad0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
13ae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13af0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13b10 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
13b20 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
13b30 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
13b40 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
13b50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13b60 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
13b70 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61   next==0 || ppPa
13b80 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  ge ){.    MemPag
13b90 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
13ba0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13bb0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
13bc0 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e   ovfl, &pPage, n
13bd0 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73 73  ext!=0);.    ass
13be0 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
13bf0 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
13c00 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
13c10 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
13c20 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
13c30 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
13c40 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a  >aData);.    }..
13c50 20 20 20 20 69 66 28 20 70 70 50 61 67 65 20 29      if( ppPage )
13c60 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  {.      *ppPage 
13c70 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c  = pPage;.    }el
13c80 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  se{.      releas
13c90 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
13ca0 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f    }.  }.  *pPgno
13cb0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20  Next = next;..  
13cc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13cd0 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
13ce0 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
13cf0 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
13d00 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
13d10 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
13d20 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
13d30 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
13d40 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
13d50 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
13d60 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
13d70 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
13d80 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
13d90 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
13da0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
13db0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
13dc0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
13dd0 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
13de0 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
13df0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
13e00 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
13e10 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
13e20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
13e30 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
13e40 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
13e50 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
13e60 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13e70 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
13e80 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
13e90 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
13ea0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
13eb0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
13ec0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
13ed0 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
13ee0 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
13ef0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
13f00 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13f10 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
13f20 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
13f30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13f40 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
13f50 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f70 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
13f80 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
13f90 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
13fa0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
13fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
13fc0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
13fd0 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
13fe0 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
13ff0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
14000 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
14010 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
14020 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
14030 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
14040 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
14050 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
14070 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
14080 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
14090 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
140a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
140b0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
140c0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
140d0 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
140e0 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
140f0 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
14100 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
14110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
14130 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
14140 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
14150 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
14160 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
14170 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
14180 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
14190 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49  s pointing to. I
141a0 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72  f the eOp.** par
141b0 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69  ameter is 0, thi
141c0 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
141d0 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69  ation (data copi
141e0 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65  ed into.** buffe
141f0 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69  r pBuf). If it i
14200 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72  s non-zero, a wr
14210 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64  ite (data copied
14220 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20   from.** buffer 
14230 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  pBuf)..**.** A t
14240 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
14250 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
14260 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
14270 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
14280 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
14290 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
142a0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
142b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
142c0 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69  es not make a di
142d0 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65  stinction betwee
142e0 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a  n key and data..
142f0 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73  ** It just reads
14300 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73   or writes bytes
14310 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61   from the payloa
14320 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69  d area.  Data mi
14330 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f  ght .** appear o
14340 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20  n the main page 
14350 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
14360 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
14370 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67  overflow .** pag
14380 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
14390 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72   BtCursor.isIncr
143a0 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
143b0 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20  is set, and the 
143c0 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f  current.** curso
143d0 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65  r entry uses one
143e0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
143f0 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75  w pages, this fu
14400 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  nction.** alloca
14410 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e  tes space for an
14420 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74  d lazily popluat
14430 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
14440 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61  page-list .** ca
14450 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
14460 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
14470 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
14480 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63   use this.** cac
14490 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
144a0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
144b0 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65  ed offset more e
144c0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
144d0 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
144e0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
144f0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
14500 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
14510 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
14520 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
14530 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
14540 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
14550 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
14560 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
14570 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
14580 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
14590 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
145a0 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
145b0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
145c0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
145d0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
145e0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
145f0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
14600 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
14610 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
14620 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
14630 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
14640 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
14650 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
14660 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
14670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
14680 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
14690 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
146a0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
146b0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
146c0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
146d0 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20 20  .  int offset,  
146e0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
146f0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
14700 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
14710 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
14720 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
14730 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
14740 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14750 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
14760 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
14770 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
14780 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  / .  int skipKey
14790 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66  ,         /* off
147a0 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61  set begins at da
147b0 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
147c0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20  ue */.  int eOp 
147d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
147e0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
147f0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
14800 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
14810 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
14820 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
14830 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
14840 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
14850 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
14860 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
14870 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 74  ge;        /* Bt
14880 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
14890 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
148a0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
148b0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  pBt = pCur->pBtr
148c0 65 65 2d 3e 70 42 74 3b 20 20 20 2f 2a 20 42 74  ee->pBt;   /* Bt
148d0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
148e0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
148f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
14900 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
14910 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
14920 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
14930 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
14940 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
14950 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
14960 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
14970 30 20 29 3b 0a 0a 20 20 47 45 54 5f 43 45 4c 4c  0 );..  GET_CELL
14980 5f 49 4e 46 4f 28 70 43 75 72 29 3b 0a 20 20 61  _INFO(pCur);.  a
14990 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
149a0 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
149b0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
149c0 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
149d0 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70  ->intKey ? 0 : p
149e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b  Cur->info.nKey);
149f0 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  ..  if( skipKey 
14a00 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  ){.    offset +=
14a10 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28   nKey;.  }.  if(
14a20 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b   offset+amt > nK
14a30 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
14a40 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ata ){.    /* Tr
14a50 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
14a60 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
14a70 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
14a80 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
14a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14aa0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
14ab0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
14ac0 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
14ad0 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
14ae0 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
14af0 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
14b00 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
14b10 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
14b20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
14b30 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
14b40 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
14b50 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
14b60 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
14b70 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
14b80 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
14b90 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
14ba0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
14bb0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
14bc0 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
14bd0 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
14be0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
14bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
14c00 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
14c10 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
14c20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14c30 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
14c40 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c    const int ovfl
14c50 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
14c60 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
14c70 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
14c80 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
14c90 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
14ca0 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
14cb0 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
14cc0 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
14cd0 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64  nLocal]);..#ifnd
14ce0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
14cf0 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49  NCRBLOB.    /* I
14d00 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62  f the isIncrblob
14d10 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
14d20 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72  et and the BtCur
14d30 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a  sor.aOverflow[].
14d40 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62      ** has not b
14d50 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
14d60 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  llocate it now. 
14d70 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a  The array is siz
14d80 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65  ed at.    ** one
14d90 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
14da0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
14db0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
14dc0 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ain. The.    ** 
14dd0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
14de0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
14df0 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  w page is stored
14e00 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
14e10 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20  ,.    ** etc. A 
14e20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
14e30 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
14e40 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79  ray means "not y
14e50 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a  et known".    **
14e60 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
14e70 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
14e80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14e90 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f   pCur->isIncrblo
14ea0 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72  bHandle && !pCur
14eb0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
14ec0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
14ed0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
14ee0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
14ef0 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
14f00 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
14f10 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
14f20 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71  low = (Pgno *)sq
14f30 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f  liteMalloc(sizeo
14f40 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
14f50 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20        if( nOvfl 
14f60 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
14f70 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
14f80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14fa0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
14fb0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
14fc0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
14fd0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
14fe0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
14ff0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
15000 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
15010 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
15020 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
15030 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
15040 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
15050 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
15060 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
15070 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
15080 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
15090 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
150a0 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
150b0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
150c0 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
150d0 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
150e0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
150f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
15100 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
15110 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
15120 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
15130 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15140 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
15150 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
15160 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
15170 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
15180 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
15190 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
151a0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
151b0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
151c0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
151d0 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
151e0 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
151f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
15200 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
15210 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
15220 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
15230 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
15240 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
15250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
15260 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
15270 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
15280 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
15290 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
152a0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
152b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
152c0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
152d0 20 70 61 67 65 0a 09 2a 2a 20 64 61 74 61 20 69   page..** data i
152e0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
152f0 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
15300 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
15310 6c 6f 77 0a 09 2a 2a 20 70 61 67 65 2d 6c 69 73  low..** page-lis
15320 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
15330 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
15340 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
15350 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
15360 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
15370 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66        */.#ifndef
15380 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
15390 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66  RBLOB.        if
153a0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
153b0 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
153c0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
153d0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
153e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
153f0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
15400 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65        } else .#e
15410 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72  ndif.          r
15420 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
15430 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
15440 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
15450 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
15460 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
15470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15480 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
15490 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
154a0 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
154b0 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
154c0 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
154d0 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
154e0 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
154f0 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
15500 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
15510 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61   */.        DbPa
15520 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
15530 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
15540 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
15550 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
15560 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
15570 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
15580 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
15590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
155a0 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
155b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
155c0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
155d0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
155e0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
155f0 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
15600 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
15610 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
15620 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d  .            a =
15630 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
15640 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  et;.          }.
15650 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
15660 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
15670 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
15680 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
15690 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
156a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
156b0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
156c0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
156d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d   0;.          am
156e0 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
156f0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
15700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
15720 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15730 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
15740 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
15750 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
15760 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15770 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
15780 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61   the key associa
15790 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
157a0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
157b0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
157c0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
157d0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
157e0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
157f0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
15800 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
15810 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15820 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
15830 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
15840 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
15850 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
15860 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
15870 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
15880 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
15890 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
158a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
158b0 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
158c0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
158d0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
158e0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
158f0 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
15900 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
15910 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
15920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15930 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
15940 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
15950 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
15960 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
15970 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
15980 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
15990 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
159a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
159b0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
159c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
159d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
159e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
159f0 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
15a00 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e  pCur->idx<pCur->
15a10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
15a20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
15a30 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
15a40 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
15a50 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
15a60 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
15a70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15a80 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
15a90 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
15aa0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
15ab0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
15ac0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
15ad0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
15ae0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
15af0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
15b00 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
15b10 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
15b20 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
15b30 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
15b40 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
15b50 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
15b60 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
15b70 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
15b80 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
15b90 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
15ba0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
15bb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15bc0 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
15bd0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
15be0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
15bf0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
15c00 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
15c10 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
15c20 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
15c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15c40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
15c50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
15c60 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
15c70 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21  rt( pCur->pPage!
15c80 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
15c90 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
15ca0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72  & pCur->idx<pCur
15cb0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
15cc0 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
15cd0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
15ce0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
15cf0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 1, 0);.  }.  r
15d00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15d10 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
15d20 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
15d30 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
15d40 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
15d50 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
15d60 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
15d70 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
15d80 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
15d90 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
15da0 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20  y if skipKey==0 
15db0 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  and it points to
15dc0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
15dd0 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69  f data if.** ski
15de0 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75  pKey==1.  The nu
15df0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
15e00 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64   available key/d
15e10 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ata is written.*
15e20 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  * into *pAmt.  I
15e30 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
15e40 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
15e50 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a  ned will not be.
15e60 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ** a valid point
15e70 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
15e80 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
15e90 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
15ea0 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
15eb0 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
15ec0 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
15ed0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
15ee0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
15ef0 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
15f00 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
15f10 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
15f20 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
15f30 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
15f40 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
15f50 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
15f60 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
15f70 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
15f80 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
15f90 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
15fa0 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
15fb0 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
15fc0 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
15fd0 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  y.** the key/dat
15fe0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
15ff0 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
16000 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
16010 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
16020 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
16030 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
16040 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
16050 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
16060 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
16070 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
16080 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
16090 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
160a0 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
160b0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
160c0 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
160d0 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61  ed char *fetchPa
160e0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
160f0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
16100 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
16110 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
16120 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
16130 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20  *pAmt,          
16140 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
16150 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
16160 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
16170 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20    int skipKey   
16180 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62         /* read b
16190 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61  eginning at data
161a0 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
161b0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
161c0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
161d0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
161e0 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  ge;.  u32 nKey;.
161f0 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20    int nLocal;.. 
16200 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
16210 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 21   && pCur->pPage!
16220 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
16230 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
16240 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
16250 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
16260 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
16270 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
16280 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
16290 6e 43 65 6c 6c 20 29 3b 0a 20 20 47 45 54 5f 43  nCell );.  GET_C
162a0 45 4c 4c 5f 49 4e 46 4f 28 70 43 75 72 29 3b 0a  ELL_INFO(pCur);.
162b0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
162c0 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20  r->info.pCell;. 
162d0 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75   aPayload += pCu
162e0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
162f0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
16300 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79  tKey ){.    nKey
16310 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
16320 20 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e     nKey = pCur->
16330 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20  info.nKey;.  }. 
16340 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
16350 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20      aPayload += 
16360 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c  nKey;.    nLocal
16370 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
16380 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d  ocal - nKey;.  }
16390 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c  else{.    nLocal
163a0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
163b0 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c  ocal;.    if( nL
163c0 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20  ocal>nKey ){.   
163d0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79     nLocal = nKey
163e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
163f0 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20  Amt = nLocal;.  
16400 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b  return aPayload;
16410 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
16420 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
16430 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
16440 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
16450 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
16460 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
16470 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
16480 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
16490 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
164a0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
164b0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
164c0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
164d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
164e0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
164f0 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
16500 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
16510 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
16520 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
16530 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
16540 65 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  e routine..**.**
16550 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
16560 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
16570 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
16580 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
16590 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
165a0 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
165b0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
165c0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
165d0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
165e0 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
165f0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
16600 74 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  t){.  if( pCur->
16610 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
16620 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
16630 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
16640 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
16650 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d  r, pAmt, 0);.  }
16660 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63  .  return 0;.}.c
16670 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
16680 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
16690 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
166a0 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 69   int *pAmt){.  i
166b0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
166c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
166d0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
166e0 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
166f0 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
16700 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
16710 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
16720 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
16730 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
16740 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
16750 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
16760 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
16770 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
16780 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
16790 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
167a0 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
167b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
167c0 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
167d0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
167e0 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d  *pNewPage;.  Mem
167f0 50 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a  Page *pOldPage;.
16800 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16810 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
16820 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
16830 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
16840 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
16850 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
16860 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
16870 2c 20 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75  , &pNewPage, pCu
16880 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28  r->pPage);.  if(
16890 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
168a0 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78  .  pNewPage->idx
168b0 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69  Parent = pCur->i
168c0 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d  dx;.  pOldPage =
168d0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
168e0 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69  pOldPage->idxShi
168f0 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  ft = 0;.  releas
16900 65 50 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b  ePage(pOldPage);
16910 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d  .  pCur->pPage =
16920 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
16930 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43  r->idx = 0;.  pC
16940 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
16950 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
16960 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20  ge->nCell<1 ){. 
16970 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16980 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
16990 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
169a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
169b0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
169c0 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20 76  he page is the v
169d0 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69  irtual root of i
169e0 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ts table..**.** 
169f0 54 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  The virtual root
16a00 20 70 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f   page is the roo
16a10 74 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74 20  t page for most 
16a20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20  tables.  But.** 
16a30 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72 6f  for the table ro
16a40 6f 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c 20  oted on page 1, 
16a50 73 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65 61  sometime the rea
16a60 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  l root page.** i
16a70 73 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66  s empty except f
16a80 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  or the right-poi
16a90 6e 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20 63  nter.  In such c
16aa0 61 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72 74  ases the.** virt
16ab0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ual root page is
16ac0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74   the page that t
16ad0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
16ae0 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69 73   of page.** 1 is
16af0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f   pointing to..*/
16b00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16b10 65 49 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50  eIsRootPage(MemP
16b20 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
16b30 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20  emPage *pParent 
16b40 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  = pPage->pParent
16b50 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d  ;.  if( pParent=
16b60 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
16b70 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67   if( pParent->pg
16b80 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  no>1 ) return 0;
16b90 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65 28  .  if( get2byte(
16ba0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
16bb0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
16bc0 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75  et+3])==0 ) retu
16bd0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
16be0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
16bf0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
16c00 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
16c10 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
16c20 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
16c30 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
16c40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
16c50 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
16c60 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
16c70 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
16c80 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
16c90 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
16ca0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
16cb0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
16cc0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
16cd0 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
16ce0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
16cf0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
16d00 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  eeMoveToParent(B
16d10 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
16d20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
16d30 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  nt;.  MemPage *p
16d40 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50  Page;.  int idxP
16d50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  arent;..  assert
16d60 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
16d70 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
16d80 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
16d90 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
16da0 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61   pPage!=0 );.  a
16db0 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 42  ssert( !sqlite3B
16dc0 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70  treeIsRootPage(p
16dd0 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65  Page) );.  pPare
16de0 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
16df0 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ent;.  assert( p
16e00 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69  Parent!=0 );.  i
16e10 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  dxParent = pPage
16e20 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73  ->idxParent;.  s
16e30 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
16e40 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
16e50 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
16e60 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e  pPage);.  pCur->
16e70 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b  pPage = pParent;
16e80 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
16e90 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ize = 0;.  asser
16ea0 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53  t( pParent->idxS
16eb0 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75  hift==0 );.  pCu
16ec0 72 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65  r->idx = idxPare
16ed0 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  nt;.}../*.** Mov
16ee0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
16ef0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
16f00 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
16f10 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
16f20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
16f30 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
16f40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16f50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16f60 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  = pCur->pBtree->
16f70 70 42 74 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  pBt;..  if( pCur
16f80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
16f90 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
16fa0 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
16fb0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
16fc0 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75   }.  pRoot = pCu
16fd0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
16fe0 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e  pRoot && pRoot->
16ff0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
17000 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Root ){.    asse
17010 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
17020 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
17030 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c    if( .      SQL
17040 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65  ITE_OK!=(rc = ge
17050 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
17060 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
17070 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20  , &pRoot, 0)).  
17080 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d    ){.      pCur-
17090 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
170a0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
170b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
170c0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
170d0 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
170e0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
170f0 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43   pRoot;.  }.  pC
17100 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70  ur->idx = 0;.  p
17110 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
17120 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  = 0;.  if( pRoot
17130 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
17140 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
17150 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
17160 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
17170 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
17180 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
17190 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
171a0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
171b0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
171c0 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
171d0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
171e0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
171f0 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
17200 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
17210 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43  bpage);.  }.  pC
17220 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
17230 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
17240 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
17250 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
17260 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17270 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
17280 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
17290 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
172a0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
172b0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
172c0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
172d0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
172e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
172f0 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
17300 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
17310 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
17320 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
17330 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
17340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
17350 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
17360 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
17370 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
17380 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
17390 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
173a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
173b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
173c0 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
173d0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
173e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
173f0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
17400 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
17410 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
17420 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
17430 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
17440 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20  , pCur->idx));. 
17450 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
17460 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
17470 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
17480 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
17490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
174a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
174b0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
174c0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
174d0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
174e0 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
174f0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
17500 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
17510 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
17520 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
17530 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
17540 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
17550 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
17560 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
17570 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
17580 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
17590 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
175a0 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
175b0 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
175c0 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
175d0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
175e0 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
175f0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
17600 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
17610 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
17620 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
17630 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
17640 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
17650 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
17660 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
17670 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
17680 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
17690 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
176a0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
176b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
176c0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
176d0 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
176e0 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
176f0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
17700 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
17710 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
17720 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
17730 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70     pCur->idx = p
17740 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
17750 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
17760 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
17770 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
17780 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
17790 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
177a0 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 70 43 75  nCell - 1;.  pCu
177b0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
177c0 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
177d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
177e0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
177f0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
17800 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
17810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
17820 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
17830 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
17840 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
17850 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
17860 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
17870 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
17880 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
17890 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
178a0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
178b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
178c0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
178d0 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65   rc;.  rc = move
178e0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
178f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
17900 72 63 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  rc;.  if( pCur->
17910 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
17920 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  NVALID ){.    as
17930 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
17940 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
17950 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
17960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17970 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
17980 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
17990 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 2a 70 52 65  Cell>0 );.  *pRe
179a0 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f  s = 0;.  rc = mo
179b0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
179c0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
179d0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
179e0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
179f0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
17a00 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
17a10 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
17a20 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
17a30 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
17a40 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
17a50 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
17a60 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
17a70 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
17a80 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
17a90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17aa0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
17ab0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
17ac0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
17ad0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
17ae0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
17af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
17b00 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
17b10 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
17b20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
17b30 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
17b40 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
17b50 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
17b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17b70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
17b80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
17b90 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20  ALID );.  *pRes 
17ba0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  = 0;.  rc = move
17bb0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
17bc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17bd0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
17be0 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
17bf0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
17c00 74 72 79 20 6e 65 61 72 20 70 4b 65 79 2f 6e 4b  try near pKey/nK
17c10 65 79 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ey..** Return a 
17c20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
17c30 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
17c40 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  ables, only the 
17c50 6e 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  nKey parameter i
17c60 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73  s used.  pKey is
17c70 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f  .** ignored.  Fo
17c80 72 20 6f 74 68 65 72 20 74 61 62 6c 65 73 2c 20  r other tables, 
17c90 6e 4b 65 79 20 69 73 20 74 68 65 20 6e 75 6d 62  nKey is the numb
17ca0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
17cb0 61 74 61 0a 2a 2a 20 69 6e 20 70 4b 65 79 2e 20  ata.** in pKey. 
17cc0 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
17cd0 66 75 6e 63 74 69 6f 6e 20 73 70 65 63 69 66 69  function specifi
17ce0 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 73  ed when the curs
17cf0 6f 72 20 77 61 73 0a 2a 2a 20 63 72 65 61 74 65  or was.** create
17d00 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  d is used to com
17d10 70 61 72 65 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  pare keys..**.**
17d20 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
17d30 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
17d40 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
17d50 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
17d60 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
17d70 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
17d80 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
17d90 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
17da0 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
17db0 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
17dc0 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
17dd0 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
17de0 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
17df0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
17e00 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
17e10 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
17e20 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
17e30 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72  which the.** cur
17e40 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20 74  sor is written t
17e50 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65 73 21  o *pRes if pRes!
17e60 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e  =NULL.  The mean
17e70 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76  ing of.** this v
17e80 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f  alue is as follo
17e90 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
17ea0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
17eb0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
17ec0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
17ed0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
17ef0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79  maller than pKey
17f00 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65   or if the table
17f10 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20   is empty.**    
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
17f30 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  d the cursor is 
17f40 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70  therefore left p
17f50 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e  oint to nothing.
17f60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
17f70 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73  ==0     The curs
17f80 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
17f90 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
17fa0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
17fb0 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79           exactly
17fc0 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a   matches pKey..*
17fd0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
17fe0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
17ff0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
18000 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
18010 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
18020 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
18030 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2f 0a 69   than pKey..*/.i
18040 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
18050 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f  oveto(.  BtCurso
18060 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
18070 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
18080 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63   be moved */.  c
18090 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
180a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
180b0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64   content for ind
180c0 69 63 65 73 2e 20 20 4e 6f 74 20 75 73 65 64 20  ices.  Not used 
180d0 62 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69  by tables */.  i
180e0 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
180f0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
18100 20 70 4b 65 79 2e 20 20 4f 72 20 74 68 65 20 6b   pKey.  Or the k
18110 65 79 20 66 6f 72 20 74 61 62 6c 65 73 20 2a 2f  ey for tables */
18120 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
18130 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ,         /* If 
18140 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
18150 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
18160 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
18170 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
18180 20 20 2f 2a 20 53 65 61 72 63 68 20 72 65 73 75    /* Search resu
18190 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20  lt flag */.){.  
181a0 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d  int rc;.  rc = m
181b0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
181c0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
181d0 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  rn rc;.  assert(
181e0 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a   pCur->pPage );.
181f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18200 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
18210 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
18220 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
18230 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
18240 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
18250 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
18260 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
18270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18280 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b  ;.  }.  for(;;){
18290 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
182a0 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  r;.    Pgno chld
182b0 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
182c0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
182d0 50 61 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20  Page;.    int c 
182e0 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72  = -1;  /* pRes r
182f0 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69  eturn if table i
18300 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20  s empty must be 
18310 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20  -1 */.    lwr = 
18320 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
18330 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
18340 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
18350 4b 65 79 20 26 26 20 70 4b 65 79 3d 3d 30 20 29  Key && pKey==0 )
18360 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
18370 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18380 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
18390 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20  ( biasRight ){. 
183a0 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
183b0 20 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   upr;.    }else{
183c0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78  .      pCur->idx
183d0 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a   = (upr+lwr)/2;.
183e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77      }.    if( lw
183f0 72 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29  r<=upr ) for(;;)
18400 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43  {.      void *pC
18410 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36  ellKey;.      i6
18420 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
18430 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
18440 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ze = 0;.      if
18450 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
18460 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70  ){.        u8 *p
18470 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43  Cell;.        pC
18480 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
18490 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
184a0 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
184b0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
184c0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
184d0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
184e0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  u32 dummy;.     
184f0 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65       pCell += ge
18500 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c  tVarint32(pCell,
18510 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20   &dummy);.      
18520 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
18530 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
18540 34 20 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  4 *)&nCellKey);.
18550 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
18560 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20  lKey<nKey ){.   
18570 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20         c = -1;. 
18580 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
18590 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29   nCellKey>nKey )
185a0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
185b0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  +1;.        }els
185c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  e{.          c =
185d0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
185e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
185f0 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65     int available
18600 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b  ;.        pCellK
18610 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65 74  ey = (void *)fet
18620 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
18630 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a  &available, 0);.
18640 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79          nCellKey
18650 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
18660 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
18670 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c  available>=nCell
18680 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
18690 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d 70   c = pCur->xComp
186a0 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c 20  are(pCur->pArg, 
186b0 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
186c0 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ey, nKey, pKey);
186d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
186e0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
186f0 65 79 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ey = sqliteMallo
18700 63 52 61 77 28 20 6e 43 65 6c 6c 4b 65 79 20 29  cRaw( nCellKey )
18710 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18720 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 20 72 65  pCellKey==0 ) re
18730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
18740 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  M;.          rc 
18750 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
18760 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  y(pCur, 0, nCell
18770 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65  Key, (void *)pCe
18780 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
18790 20 20 63 20 3d 20 70 43 75 72 2d 3e 78 43 6f 6d    c = pCur->xCom
187a0 70 61 72 65 28 70 43 75 72 2d 3e 70 41 72 67 2c  pare(pCur->pArg,
187b0 20 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c   nCellKey, pCell
187c0 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29  Key, nKey, pKey)
187d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
187e0 74 65 46 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  teFree(pCellKey)
187f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18800 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
18810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18820 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
18830 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
18840 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
18850 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
18860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
18870 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20   = pCur->idx;.  
18880 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77          upr = lw
18890 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r - 1;.         
188a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
188b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
188c0 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65   if( pRes ) *pRe
188d0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
188e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
188f0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
18900 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
18910 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
18920 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b  r = pCur->idx+1;
18930 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18940 20 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72        upr = pCur
18950 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  ->idx-1;.      }
18960 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
18970 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  pr ){.        br
18980 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18990 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28     pCur->idx = (
189a0 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20  lwr+upr)/2;.    
189b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
189c0 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20  r==upr+1 );.    
189d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
189e0 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
189f0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
18a00 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
18a10 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
18a20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
18a30 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
18a40 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
18a50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
18a60 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
18a70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18a80 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
18a90 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
18aa0 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
18ab0 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
18ac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
18ad0 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
18ae0 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43   && pCur->idx<pC
18af0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
18b00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52   );.      if( pR
18b10 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a  es ) *pRes = c;.
18b20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18b30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18b40 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77    pCur->idx = lw
18b50 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
18b60 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
18b70 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
18b80 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
18b90 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
18ba0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18bb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4e      }.  }.  /* N
18bc0 4f 54 20 52 45 41 43 48 45 44 20 2a 2f 0a 7d 0a  OT REACHED */.}.
18bd0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
18be0 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
18bf0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
18c00 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
18c10 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
18c20 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
18c30 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
18c40 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
18c50 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
18c60 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
18c70 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
18c80 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
18c90 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
18ca0 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
18cb0 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
18cc0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
18cd0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
18ce0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
18cf0 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
18d00 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
18d10 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
18d20 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
18d30 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
18d40 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
18d50 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
18d60 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
18d70 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
18d80 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
18d90 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
18da0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
18db0 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
18dc0 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
18dd0 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
18de0 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
18df0 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
18e00 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
18e10 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
18e20 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
18e30 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
18e40 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
18e50 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
18e60 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
18e70 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
18e80 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
18e90 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
18ea0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
18eb0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
18ec0 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
18ed0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
18ee0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18ef0 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
18f00 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
18f10 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
18f20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
18f30 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
18f40 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
18f50 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
18f60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18f70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
18f80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18f90 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61  pRes!=0 );.  pPa
18fa0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
18fb0 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
18fc0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
18fd0 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
18fe0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
18ff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
19000 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
19010 70 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  p>0 ){.    pCur-
19020 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a  >skip = 0;.    *
19030 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
19040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19050 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
19060 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
19070 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
19080 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
19090 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ->idx<pPage->nCe
190a0 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
190b0 64 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  dx++;.  pCur->in
190c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
190d0 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70  if( pCur->idx>=p
190e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
190f0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
19100 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
19110 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
19120 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
19130 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
19140 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
19150 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
19160 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19170 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
19180 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
19190 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
191a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
191b0 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
191c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
191d0 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50  reeIsRootPage(pP
191e0 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  age) ){.        
191f0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
19200 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
19210 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
19220 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
19230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19240 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
19250 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
19260 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
19270 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
19280 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  age;.    }while(
19290 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67   pCur->idx>=pPag
192a0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
192b0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
192c0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
192d0 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ta ){.      rc =
192e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
192f0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
19300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19310 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19320 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
19330 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
19340 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
19350 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
19360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19370 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
19380 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
19390 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
193a0 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
193b0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
193c0 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
193d0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
193e0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
193f0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
19400 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
19410 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
19420 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
19430 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
19440 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
19450 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
19460 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
19470 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
19480 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
19490 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
194a0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
194b0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
194c0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
194d0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d    Pgno pgno;.  M
194e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
194f0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
19500 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
19510 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
19520 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
19540 0a 20 20 7d 0a 20 20 69 66 28 20 43 55 52 53 4f  .  }.  if( CURSO
19550 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
19560 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
19570 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
19580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19590 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
195a0 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43  skip<0 ){.    pC
195b0 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
195c0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
195d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
195e0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
195f0 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  kip = 0;..  pPag
19600 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
19610 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19620 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
19630 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
19640 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  =0 );.  if( !pPa
19650 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
19660 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
19670 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
19680 20 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20   pCur->idx) );. 
19690 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
196a0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
196b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
196c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
196d0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
196e0 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
196f0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
19700 72 2d 3e 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20  r->idx==0 ){.   
19710 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
19720 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50  reeIsRootPage(pP
19730 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  age) ){.        
19740 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
19750 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
19760 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
19770 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
19780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19790 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
197a0 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
197b0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
197c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
197d0 61 67 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  age;.    }.    p
197e0 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a 20 20 20 20  Cur->idx--;.    
197f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
19800 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
19810 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26  age->leafData &&
19820 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
19830 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19840 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
19850 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
19860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19870 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19880 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73     }.  }.  *pRes
19890 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
198a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
198b0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
198c0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
198d0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
198e0 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
198f0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
19900 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
19910 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19920 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
19930 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
19940 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
19950 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
19960 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
19970 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
19980 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
19990 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
199a0 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
199b0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
199c0 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
199d0 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
199e0 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
199f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
19a00 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
19a10 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
19a20 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
19a30 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
19a40 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e  ppPage and *pPgn
19a50 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20  o are undefined 
19a60 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
19a70 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20  an error..** Do 
19a80 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  not invoke sqlit
19a90 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
19aa0 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20  n *ppPage if an 
19ab0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
19ac0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
19ad0 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
19ae0 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
19af0 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66  n a (feeble) eff
19b00 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
19b10 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
19b20 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
19b30 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
19b40 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
19b50 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
19b60 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
19b70 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
19b80 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
19b90 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
19ba0 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
19bb0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
19bc0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
19bd0 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
19be0 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61  f the "exact" pa
19bf0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
19c00 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e  , and the page-n
19c10 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69  umber nearby exi
19c20 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65  sts .** anywhere
19c30 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
19c40 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
19c50 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72  arenteed to be r
19c60 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
19c70 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
19c80 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
19c90 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f  abases when allo
19ca0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  cating a new tab
19cb0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
19cc0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
19cd0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
19ce0 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65  *pBt, .  MemPage
19cf0 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67   **ppPage, .  Pg
19d00 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67  no *pPgno, .  Pg
19d10 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20  no nearby,.  u8 
19d20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  exact.){.  MemPa
19d30 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
19d40 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20  t rc;.  int n;  
19d50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19d60 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
19d70 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b  elist */.  int k
19d80 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
19d90 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
19da0 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
19db0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
19dc0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
19dd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
19de0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 70  vTrunk = 0;..  p
19df0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
19e00 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  ge1;.  n = get4b
19e10 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
19e20 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e  ta[36]);.  if( n
19e30 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
19e40 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
19e50 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
19e60 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
19e70 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
19e80 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
19e90 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
19ea0 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
19eb0 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
19ec0 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
19ed0 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
19ee0 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
19ef0 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
19f00 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
19f10 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
19f20 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
19f30 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
19f40 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
19f50 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
19f60 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
19f70 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
19f80 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
19f90 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
19fa0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
19fb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19fc0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
19fd0 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
19fe0 62 79 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72  by<=sqlite3Pager
19ff0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1a000 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1a010 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
1a020 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
1a030 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1a040 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1a050 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
1a060 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
1a070 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
1a080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1a090 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1a0a0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1a0b0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1a0c0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
1a0d0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
1a0e0 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
1a0f0 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
1a100 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
1a110 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
1a120 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
1a130 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
1a140 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
1a150 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
1a160 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
1a170 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
1a180 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
1a190 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
1a1a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a1b0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1a1c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1a1d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
1a1e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1a1f0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
1a200 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
1a210 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
1a220 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
1a230 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
1a240 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
1a250 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
1a260 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
1a270 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
1a280 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
1a290 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
1a2a0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
1a2b0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
1a2c0 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
1a2d0 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
1a2e0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
1a2f0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
1a300 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
1a310 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
1a320 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
1a330 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
1a340 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a350 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
1a360 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1a370 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
1a380 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1a390 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a3a0 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
1a3b0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
1a3c0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1a3d0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1a3e0 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
1a3f0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1a400 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
1a410 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
1a420 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
1a430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  );.      if( k==
1a440 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
1a450 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1a460 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
1a470 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
1a480 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
1a490 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
1a4a0 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
1a4b0 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
1a4c0 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
1a4d0 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
1a4e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
1a4f0 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
1a500 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1a510 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
1a520 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1a530 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1a540 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1a550 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1a560 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1a570 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1a580 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1a590 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
1a5a0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
1a5b0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
1a5c0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
1a5d0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1a5e0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
1a5f0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
1a600 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1a610 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1a620 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
1a630 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
1a640 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
1a650 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
1a660 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d  }else if( k>pBt-
1a670 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
1a680 38 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  8 ){.        /* 
1a690 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
1a6a0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
1a6b0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1a6c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
1a6d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1a6e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
1a6f0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1a700 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
1a710 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1a720 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
1a730 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
1a740 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  && nearby==iTrun
1a750 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
1a760 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
1a770 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
1a780 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
1a790 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
1a7a0 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
1a7b0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1a7c0 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
1a7d0 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
1a7e0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
1a7f0 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e  t( *pPgno==iTrun
1a800 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  k );.        *pp
1a810 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
1a820 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
1a830 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
1a840 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a850 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1a860 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1a870 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1a880 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1a890 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1a8a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1a8b0 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
1a8c0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
1a8d0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
1a8e0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1a8f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
1a900 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1a910 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
1a920 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a930 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
1a940 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1a950 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1a960 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1a970 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1a980 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1a990 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
1a9a0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
1a9b0 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
1a9c0 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
1a9d0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
1a9e0 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
1a9f0 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
1aa00 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
1aa10 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
1aa20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1aa30 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1aa40 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
1aa50 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
1aa60 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
1aa70 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
1aa80 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1aa90 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
1aaa0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1aab0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
1aac0 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
1aad0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
1aae0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1aaf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ab00 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1ab10 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1ab20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ab30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ab40 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
1ab50 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1ab60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1ab70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ab80 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1ab90 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
1aba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1abb0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1abc0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1abd0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1abe0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
1abf0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1ac00 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1ac10 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1ac20 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
1ac30 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1ac40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1ac50 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
1ac60 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
1ac70 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
1ac80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
1ac90 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
1aca0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
1acb0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
1acc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
1acd0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1ace0 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
1acf0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1ad00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ad10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ad20 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
1ad30 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1ad40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1ad50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
1ad60 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1ad70 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1ad80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ad90 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1ada0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1adb0 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
1adc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1add0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ade0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1adf0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1ae00 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
1ae10 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
1ae20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
1ae30 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
1ae40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ae50 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
1ae60 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
1ae70 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
1ae80 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  int closest;.   
1ae90 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
1aea0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1aeb0 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
1aec0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
1aed0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1aee0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1aef0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1af00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1af10 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1af20 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1af30 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1af40 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
1af50 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
1af60 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20  int i, dist;.   
1af70 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1af80 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
1af90 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
1afa0 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
1afb0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
1afc0 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
1afd0 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
1afe0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
1aff0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1b000 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
1b010 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
1b020 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
1b030 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
1b040 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
1b050 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1b060 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
1b070 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
1b080 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
1b090 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
1b0a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b0b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1b0c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1b0d0 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
1b0e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1b0f0 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
1b100 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
1b110 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t*4]);.        i
1b120 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
1b130 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
1b140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  ){.          *pP
1b150 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
1b160 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e         if( *pPgn
1b170 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o>sqlite3PagerPa
1b180 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1b190 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
1b1a0 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65      /* Free page
1b1b0 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
1b1c0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
1b1d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1b1e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1b1f0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
1b200 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
1b210 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
1b220 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
1b230 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1b250 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
1b260 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
1b270 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
1b280 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
1b290 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
1b2a0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  1));.          i
1b2b0 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
1b2c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1b2d0 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
1b2e0 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
1b2f0 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
1b300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b310 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
1b320 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
1b330 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b340 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
1b350 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
1b360 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  age, 1);.       
1b370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b390 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1b3a0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70  DontRollback((*p
1b3b0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
1b3c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1b3d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1b3e0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
1b3f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1b400 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b420 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1b430 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
1b440 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1b450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b460 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1b470 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1b480 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
1b490 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
1b4a0 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
1b4b0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
1b4c0 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
1b4d0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1b4e0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
1b4f0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1b500 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74  eelist, so creat
1b510 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20  e a new page at 
1b520 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f  the.    ** end o
1b530 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
1b540 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71 6c 69 74    *pPgno = sqlit
1b550 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1b560 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 2b 20  (pBt->pPager) + 
1b570 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  1;..#ifndef SQLI
1b580 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1b590 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
1b5a0 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  nTrunc ){.      
1b5b0 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63 75 75  /* An incr-vacuu
1b5c0 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75  m has already ru
1b5d0 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
1b5e0 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68  ansaction. So th
1b5f0 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  e.      ** page 
1b600 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e  to allocate is n
1b610 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68 79 73  ot from the phys
1b620 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68 65 20  ical end of the 
1b630 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20 20 20  file, but.      
1b640 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e  ** at pBt->nTrun
1b650 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  c. .      */.   
1b660 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
1b670 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20  >nTrunc+1;.     
1b680 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e   if( *pPgno==PEN
1b690 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1b6a0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 28  Bt) ){.        (
1b6b0 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  *pPgno)++;.     
1b6c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1b6d0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1b6e0 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
1b6f0 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29  E(pBt, *pPgno) )
1b700 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
1b710 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
1b720 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1b730 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
1b740 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
1b750 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
1b760 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
1b770 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
1b780 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
1b790 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
1b7a0 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
1b7b0 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
1b7c0 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
1b7d0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
1b7e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41      */.      TRA
1b7f0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1b800 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
1b810 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
1b820 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f  page)\n", *pPgno
1b830 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
1b840 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1b850 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1b860 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e   );.      (*pPgn
1b870 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  o)++;.    }.    
1b880 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  if( pBt->nTrunc 
1b890 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
1b8a0 72 75 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20  runc = *pPgno;. 
1b8b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1b8c0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1b8d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1b8e0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
1b8f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1b900 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
1b910 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
1b920 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1b930 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
1b940 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1b950 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
1b960 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1b970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b980 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1b990 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
1b9a0 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
1b9b0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
1b9c0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22  m end of file\n"
1b9d0 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a  , *pPgno));.  }.
1b9e0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e  .  assert( *pPgn
1b9f0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
1ba00 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e  PAGE(pBt) );..en
1ba10 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a  d_allocate_page:
1ba20 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1ba30 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73  Trunk);.  releas
1ba40 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
1ba50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ba60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70  }../*.** Add a p
1ba70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1ba80 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
1ba90 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
1baa0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1bab0 66 28 29 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65  f() is NOT calle
1bac0 64 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  d for pPage..*/.
1bad0 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
1bae0 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
1baf0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
1bb00 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1bb10 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
1bb20 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1bb30 65 31 3b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c  e1;.  int rc, n,
1bb40 20 6b 3b 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72   k;..  /* Prepar
1bb50 65 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 66  e the page for f
1bb60 72 65 65 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65  reeing */.  asse
1bb70 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e  rt( pPage->pgno>
1bb80 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  1 );.  pPage->is
1bb90 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65  Init = 0;.  rele
1bba0 61 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70  asePage(pPage->p
1bbb0 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65  Parent);.  pPage
1bbc0 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a  ->pParent = 0;..
1bbd0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1bbe0 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
1bbf0 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
1bc00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1bc10 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1bc20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
1bc30 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1bc40 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
1bc50 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1bc60 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
1bc70 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1bc80 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65  6], n+1);..#ifde
1bc90 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
1bca0 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
1bcb0 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
1bcc0 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
1bcd0 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
1bce0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
1bcf0 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
1bd00 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
1bd10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
1bd20 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
1bd30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1bd40 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
1bd50 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
1bd60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1bd70 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
1bd80 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
1bd90 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
1bda0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
1bdb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1bdc0 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68  ACUUM.  /* If th
1bdd0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
1bde0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
1bdf0 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
1be00 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
1be10 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
1be20 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
1be30 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
1be40 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1be50 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
1be60 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
1be70 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54   pPage->pgno, PT
1be80 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
1be90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1bea0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
1beb0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d  endif..  if( n==
1bec0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1bed0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 72   is the first fr
1bee0 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72  ee page */.    r
1bef0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1bf00 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
1bf10 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1bf20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1bf30 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
1bf40 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20  >aData, 0, 8);. 
1bf50 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1bf60 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1bf70 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1bf80 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1bf90 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22  AGE: %d first\n"
1bfa0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
1bfb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1bfc0 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65   Other free page
1bfd0 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  s already exist.
1bfe0 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69    Retrive the fi
1bff0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  rst trunk page. 
1c000 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65     ** of the fre
1c010 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f  elist and find o
1c020 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76  ut how many leav
1c030 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20  es it has. */.  
1c040 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
1c050 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  k;.    rc = sqli
1c060 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
1c070 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
1c080 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1c090 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  ), &pTrunk, 0);.
1c0a0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1c0b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20  urn rc;.    k = 
1c0c0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
1c0d0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
1c0e0 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61   if( k>=pBt->usa
1c0f0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
1c100 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72  .      /* The tr
1c110 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75  unk is full.  Tu
1c120 72 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  rn the page bein
1c130 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e  g freed into a n
1c140 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  ew.      ** trun
1c150 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c  k page with no l
1c160 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  eaves. */.      
1c170 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c180 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
1c190 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
1c1a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1c1b0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1c1c0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70  (pPage->aData, p
1c1d0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20  Trunk->pgno);.  
1c1e0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1c1f0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
1c200 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1c210 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1c220 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  [32], pPage->pgn
1c230 6f 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  o);.      TRACE(
1c240 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
1c250 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
1c260 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a  eplacing %d\n",.
1c270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1c280 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e  age->pgno, pTrun
1c290 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  k->pgno));.    }
1c2a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1c2b0 64 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65  dd the newly fre
1c2c0 65 64 20 70 61 67 65 20 61 73 20 61 20 6c 65 61  ed page as a lea
1c2d0 66 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  f on the current
1c2e0 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
1c2f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c300 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1c310 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
1c320 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c330 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
1c340 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1c350 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20  ata[4], k+1);.  
1c360 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1c370 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
1c380 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e  k*4], pPage->pgn
1c390 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o);.#ifndef SQLI
1c3a0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1c3b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c3c0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
1c3d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1c3e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
1c3f0 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
1c400 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
1c410 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
1c420 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
1c430 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
1c440 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
1c450 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
1c460 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c470 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
1c480 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
1c490 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1c4a0 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
1c4b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1c4c0 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
1c4d0 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
1c4e0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
1c4f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c500 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1c510 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1c520 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
1c530 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1c540 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66  nOvfl;.  int ovf
1c550 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 73 71  lPageSize;..  sq
1c560 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
1c570 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
1c580 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
1c590 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
1c5a0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
1c5b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
1c5c0 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
1c5d0 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
1c5e0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
1c5f0 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
1c600 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1c610 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
1c620 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50  rflow]);.  ovflP
1c630 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
1c640 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
1c650 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
1c660 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
1c670 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
1c680 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
1c690 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
1c6a0 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
1c6b0 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
1c6c0 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
1c6d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
1c6e0 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c  fl;.    if( ovfl
1c6f0 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50  Pgno==0 || ovflP
1c700 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72  gno>sqlite3Pager
1c710 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1c720 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1c730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1c740 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1c750 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f  }..    rc = getO
1c760 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
1c770 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
1c780 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a  l, (nOvfl==0)?0:
1c790 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20  &ovflPgno);.    
1c7a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1c7b0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65  rc;.    rc = fre
1c7c0 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
1c7d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1c7e0 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
1c7f0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1c800 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
1c810 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c820 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
1c830 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
1c840 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
1c850 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
1c860 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
1c870 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
1c880 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
1c890 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
1c8a0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
1c8b0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
1c8c0 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
1c8d0 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
1c8e0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
1c8f0 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
1c900 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
1c910 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
1c920 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
1c930 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
1c940 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
1c950 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
1c960 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
1c970 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
1c980 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
1c990 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
1c9a0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1c9b0 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
1c9c0 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
1c9d0 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
1c9e0 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
1c9f0 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
1ca00 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
1ca10 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
1ca20 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
1ca30 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
1ca40 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
1ca50 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
1ca60 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1ca70 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1ca80 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
1ca90 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
1caa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1cab0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
1cac0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
1cad0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
1cae0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
1caf0 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
1cb00 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
1cb10 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
1cb20 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
1cb30 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
1cb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
1cb50 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
1cb60 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
1cb70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
1cb80 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1cb90 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
1cba0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
1cbb0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
1cbc0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
1cbd0 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
1cbe0 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
1cbf0 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
1cc00 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
1cc10 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
1cc20 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
1cc30 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
1cc40 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
1cc50 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
1cc60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1cc70 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
1cc80 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
1cc90 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
1cca0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1ccb0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
1ccc0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
1ccd0 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
1cce0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1ccf0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
1cd00 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
1cd10 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
1cd20 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
1cd30 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
1cd40 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
1cd50 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
1cd60 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
1cd70 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
1cd80 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
1cd90 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
1cda0 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
1cdb0 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  y);.  sqlite3Btr
1cdc0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
1cdd0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
1cde0 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
1cdf0 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
1ce00 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
1ce10 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
1ce20 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
1ce30 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61  nfo.nData==nData
1ce40 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a 20 20 2f  +nZero );.  .  /
1ce50 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
1ce60 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
1ce70 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
1ce80 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
1ce90 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1cea0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
1ceb0 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
1cec0 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
1ced0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79   }else{.    nPay
1cee0 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  load += nKey;.  
1cef0 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
1cf00 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a     nSrc = nKey;.
1cf10 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
1cf20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
1cf30 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
1cf40 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
1cf50 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
1cf60 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
1cf70 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
1cf80 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
1cf90 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
1cfa0 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
1cfb0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  t==0 ){.      in
1cfc0 74 20 69 73 45 78 61 63 74 20 3d 20 30 3b 0a 23  t isExact = 0;.#
1cfd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cfe0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1cff0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
1d000 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
1d010 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
1d020 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
1d030 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
1d040 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1d050 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
1d060 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
1d070 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
1d080 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
1d090 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
1d0a0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
1d0b0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
1d0c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1d0d0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
1d0e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1d0f0 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a 20 20 20  gnoOvfl>1 ){.   
1d100 20 20 20 20 20 20 20 2f 2a 20 69 73 45 78 61 63         /* isExac
1d110 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20 20 20 20  t = 1; */.      
1d120 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
1d130 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
1d140 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d150 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
1d160 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
1d170 2c 20 69 73 45 78 61 63 74 29 3b 0a 23 69 66 6e  , isExact);.#ifn
1d180 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d190 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1d1a0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
1d1b0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
1d1c0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
1d1d0 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
1d1e0 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
1d1f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1d200 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
1d210 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
1d220 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
1d230 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
1d240 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
1d250 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d260 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1d270 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
1d280 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
1d290 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
1d2a0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
1d2b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
1d2c0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
1d2d0 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
1d2e0 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
1d2f0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
1d300 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
1d310 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
1d320 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
1d330 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
1d340 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
1d350 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
1d360 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
1d370 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
1d380 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
1d390 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
1d3a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1d3b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
1d3c0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1d3d0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
1d3e0 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
1d3f0 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
1d400 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
1d410 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OW1);.        rc
1d420 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
1d430 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
1d440 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  e, pgnoPtrmap);.
1d450 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1d460 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
1d470 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
1d480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d490 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
1d4a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1d4b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
1d4c0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
1d4d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d4e0 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1d4f0 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
1d500 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
1d510 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
1d520 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
1d530 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
1d540 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
1d550 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
1d560 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
1d570 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
1d580 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
1d590 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
1d5a0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
1d5b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
1d5c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
1d5d0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
1d5e0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
1d5f0 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  n = spaceLeft;. 
1d600 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
1d610 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
1d620 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
1d630 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
1d640 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
1d650 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
1d660 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
1d670 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
1d680 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
1d690 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
1d6a0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
1d6b0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
1d6c0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
1d6d0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
1d6e0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
1d6f0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
1d700 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
1d710 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
1d720 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
1d730 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1d740 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
1d750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d760 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
1d770 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 50 61 72  the MemPage.pPar
1d780 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74  ent pointer on t
1d790 68 65 20 70 61 67 65 20 77 68 6f 73 65 20 6e 75  he page whose nu
1d7a0 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e  mber is.** given
1d7b0 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61   in the second a
1d7c0 72 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  rgument so that 
1d7d0 4d 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20  MemPage.pParent 
1d7e0 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69  holds the.** poi
1d7f0 6e 74 65 72 20 69 6e 20 74 68 65 20 74 68 69 72  nter in the thir
1d800 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
1d810 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65  tatic int repare
1d820 6e 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20  ntPage(BtShared 
1d830 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pBt, Pgno pgno,
1d840 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
1d850 72 65 6e 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a  rent, int idx){.
1d860 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 68 69 73    MemPage *pThis
1d870 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
1d880 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1d890 70 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b  pNewParent!=0 );
1d8a0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
1d8b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d8c0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  K;.  assert( pBt
1d8d0 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
1d8e0 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
1d8f0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
1d900 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
1d910 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
1d920 29 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28  ){.    pThis = (
1d930 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
1d940 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
1d950 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1d960 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29   pThis->isInit )
1d970 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1d980 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 28 73  pThis->aData==(s
1d990 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1d9a0 74 61 28 70 44 62 50 61 67 65 29 29 20 29 3b 0a  ta(pDbPage)) );.
1d9b0 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
1d9c0 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50 61  >pParent!=pNewPa
1d9d0 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
1d9e0 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
1d9f0 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  nt ) sqlite3Page
1da00 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50  rUnref(pThis->pP
1da10 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
1da20 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e  .        pThis->
1da30 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61  pParent = pNewPa
1da40 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71  rent;.        sq
1da50 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 4e  lite3PagerRef(pN
1da60 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  ewParent->pDbPag
1da70 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1da80 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65    pThis->idxPare
1da90 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a  nt = idx;.    }.
1daa0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1dab0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
1dac0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1dad0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1dae0 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
1daf0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1db00 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
1db10 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52  t(pBt, pgno, PTR
1db20 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50  MAP_BTREE, pNewP
1db30 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
1db40 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
1db50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1db60 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
1db70 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74  he pParent point
1db80 65 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  er of all childr
1db90 65 6e 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70  en of pPage to p
1dba0 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  oint back.** to 
1dbb0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pPage..**.** In 
1dbc0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72  other words, for
1dbd0 20 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20   every child of 
1dbe0 70 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65  pPage, invoke re
1dbf0 70 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20  parentPage().** 
1dc00 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
1dc10 74 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f  t each child kno
1dc20 77 73 20 74 68 61 74 20 70 50 61 67 65 20 69 73  ws that pPage is
1dc30 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   its parent..**.
1dc40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1dc50 67 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65  gets called afte
1dc60 72 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f  r you memcpy() o
1dc70 6e 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20  ne page into.** 
1dc80 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  another..*/.stat
1dc90 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43  ic int reparentC
1dca0 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67  hildPages(MemPag
1dcb0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
1dcc0 20 69 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   i;.  BtShared *
1dcd0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1dce0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1dcf0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
1dd00 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74  Page->leaf ) ret
1dd10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1dd20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
1dd30 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
1dd40 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
1dd50 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1dd60 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50   i);.    if( !pP
1dd70 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1dd80 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
1dd90 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
1dda0 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61 67 65  te(pCell), pPage
1ddb0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1ddc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1ddd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1dde0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
1ddf0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
1de00 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65  c = reparentPage
1de10 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26  (pBt, get4byte(&
1de20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1de30 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1de40 29 2c 20 0a 20 20 20 20 20 20 20 70 50 61 67 65  ), .       pPage
1de50 2c 20 69 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  , i);.    pPage-
1de60 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20  >idxShift = 0;. 
1de70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1de80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
1de90 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
1dea0 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
1deb0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
1dec0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
1ded0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
1dee0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
1def0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
1df00 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1df10 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
1df20 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
1df30 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
1df40 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
1df50 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
1df60 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
1df70 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
1df80 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
1df90 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
1dfa0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1dfb0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
1dfc0 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
1dfd0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
1dfe0 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
1dff0 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20  t sz){.  int i; 
1e000 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1e010 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
1e020 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t pc;         /*
1e030 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
1e040 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
1e050 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
1e060 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
1e070 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
1e080 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
1e090 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1e0a0 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
1e0b0 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
1e0c0 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
1e0d0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
1e0e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1e0f0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
1e100 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
1e110 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1e120 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1e130 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
1e140 62 50 61 67 65 29 20 29 3b 0a 20 20 64 61 74 61  bPage) );.  data
1e150 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
1e160 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70  .  ptr = &data[p
1e170 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
1e180 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20   + 2*idx];.  pc 
1e190 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
1e1a0 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 31 30  .  assert( pc>10
1e1b0 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65   && pc+sz<=pPage
1e1c0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
1e1d0 65 20 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65  e );.  freeSpace
1e1e0 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
1e1f0 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20  .  for(i=idx+1; 
1e200 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
1e210 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20  i++, ptr+=2){.  
1e220 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32    ptr[0] = ptr[2
1e230 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  ];.    ptr[1] = 
1e240 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50  ptr[3];.  }.  pP
1e250 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
1e260 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
1e270 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1e280 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
1e290 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
1e2a0 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d  e += 2;.  pPage-
1e2b0 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d  >idxShift = 1;.}
1e2c0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
1e2d0 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
1e2e0 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
1e2f0 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
1e300 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
1e310 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
1e320 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
1e330 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
1e340 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
1e350 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
1e360 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
1e370 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
1e380 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
1e390 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
1e3a0 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
1e3b0 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
1e3c0 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
1e3d0 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
1e3e0 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
1e3f0 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
1e400 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
1e410 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
1e420 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
1e430 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
1e440 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
1e450 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
1e460 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
1e470 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
1e480 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
1e490 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
1e4a0 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
1e4b0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
1e4c0 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
1e4d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
1e4e0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1e4f0 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
1e500 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
1e510 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
1e520 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
1e530 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
1e540 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
1e550 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
1e560 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
1e570 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
1e580 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
1e590 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
1e5a0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
1e5b0 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
1e5c0 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
1e5d0 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
1e5e0 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c  c int insertCell
1e5f0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
1e600 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
1e610 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
1e620 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
1e630 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
1e640 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
1e650 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
1e660 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
1e670 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
1e680 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
1e690 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
1e6a0 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
1e6b0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1e6c0 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
1e6d0 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
1e6e0 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
1e6f0 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
1e700 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
1e710 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b  eded */.  u8 nSk
1e720 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ip          /* D
1e730 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  o not write the 
1e740 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
1e750 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  s of the cell */
1e760 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20  .){.  int idx;  
1e770 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
1e780 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
1e790 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
1e7a0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1e7c0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1e7d0 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
1e7e0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
1e7f0 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   of content for 
1e800 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61  any cell in data
1e810 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  [] */.  int end;
1e820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1e830 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
1e840 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
1e850 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
1e860 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
1e870 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1e880 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
1e890 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
1e8a0 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
1e8b0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
1e8c0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1e8d0 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61  data[] of the pa
1e8e0 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
1e8f0 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
1e900 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
1e910 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
1e920 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
1e930 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
1e940 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
1e950 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
1e960 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
1e970 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
1e980 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
1e990 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
1e9a0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20   in data[] */.. 
1e9b0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
1e9c0 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
1e9d0 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
1e9e0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  w );.  assert( s
1e9f0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
1ea00 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a  Page, pCell) );.
1ea10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ea20 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1ea30 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1ea40 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
1ea50 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
1ea60 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
1ea70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
1ea80 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
1ea90 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
1eaa0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
1eab0 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
1eac0 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
1ead0 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
1eae0 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
1eaf0 20 20 61 73 73 65 72 74 28 20 6a 3c 73 69 7a 65    assert( j<size
1eb00 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29  of(pPage->aOvfl)
1eb10 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
1eb20 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Ovfl[0]) );.    
1eb30 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
1eb40 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
1eb50 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
1eb60 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20 20  j].idx = i;.    
1eb70 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30  pPage->nFree = 0
1eb80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1eb90 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
1eba0 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50  ta;.    hdr = pP
1ebb0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
1ebc0 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
1ebd0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
1ebe0 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
1ebf0 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
1ec00 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
1ec10 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
1ec20 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b  Page->nCell + 2;
1ec30 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
1ec40 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
1ec50 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d   if( end > top -
1ec60 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 69 6e 74   sz ){.      int
1ec70 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
1ec80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
1ec90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1eca0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1ecb0 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65  ;.      top = ge
1ecc0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
1ecd0 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  +5]);.      asse
1ece0 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20  rt( end + sz <= 
1ecf0 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  top );.    }.   
1ed00 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53   idx = allocateS
1ed10 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b  pace(pPage, sz);
1ed20 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
1ed30 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
1ed40 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74  ( end <= get2byt
1ed50 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
1ed60 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
1ed70 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
1ed80 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20  ->nFree -= 2;.  
1ed90 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
1eda0 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
1edb0 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
1edc0 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64  );.    for(j=end
1edd0 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d  -2, ptr=&data[j]
1ede0 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70  ; j>ins; j-=2, p
1edf0 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74  tr-=2){.      pt
1ee00 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a  r[0] = ptr[-2];.
1ee10 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70        ptr[1] = p
1ee20 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  tr[-1];.    }.  
1ee30 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
1ee40 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
1ee50 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
1ee60 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
1ee70 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  Cell);.    pPage
1ee80 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a  ->idxShift = 1;.
1ee90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1eea0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1eeb0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
1eec0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1eed0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
1eee0 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
1eef0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
1ef00 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
1ef10 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
1ef20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
1ef30 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
1ef40 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
1ef50 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
1ef60 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  */.      CellInf
1ef70 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71  o info;.      sq
1ef80 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
1ef90 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
1efa0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1efb0 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f     assert( (info
1efc0 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
1efd0 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
1efe0 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  y))==info.nPaylo
1eff0 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ad );.      if( 
1f000 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
1f010 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
1f020 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c  o.nKey))>info.nL
1f030 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
1f040 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
1f050 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
1f060 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
1f070 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
1f080 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61   = ptrmapPut(pPa
1f090 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66  ge->pBt, pgnoOvf
1f0a0 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
1f0b0 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
1f0c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1f0d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1f0e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f0f0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
1f100 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1f110 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1f120 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
1f130 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
1f140 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
1f150 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
1f160 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
1f170 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
1f180 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
1f190 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
1f1a0 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
1f1b0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
1f1c0 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
1f1d0 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
1f1e0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
1f1f0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
1f200 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
1f210 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
1f220 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
1f230 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
1f240 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
1f250 62 6f 64 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  bodies */.  int 
1f260 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
1f270 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
1f280 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
1f290 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
1f2a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
1f2b0 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65  .  int totalSize
1f2c0 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69  ;    /* Total si
1f2d0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
1f2e0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
1f2f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1f300 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
1f310 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b  /.  int cellptr;
1f320 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1f330 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
1f340 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
1f350 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
1f360 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
1f370 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
1f380 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
1f390 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65   /* Data for the
1f3a0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
1f3b0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
1f3c0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 74 6f 74  flow==0 );.  tot
1f3d0 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f  alSize = 0;.  fo
1f3e0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1f3f0 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53  i++){.    totalS
1f400 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ize += aSize[i];
1f410 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74  .  }.  assert( t
1f420 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c  otalSize+2*nCell
1f430 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  <=pPage->nFree )
1f440 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f450 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1f460 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65   cellptr = pPage
1f470 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
1f480 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
1f490 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
1f4a0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
1f4b0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
1f4c0 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
1f4d0 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20    if( nCell ){. 
1f4e0 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c     cellbody = al
1f4f0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
1f500 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20  e, totalSize);. 
1f510 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62     assert( cellb
1f520 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ody>0 );.    ass
1f530 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
1f540 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a  e >= 2*nCell );.
1f550 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
1f560 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20   -= 2*nCell;.   
1f570 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1f580 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
1f590 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  ut2byte(&data[ce
1f5a0 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79  llptr], cellbody
1f5b0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
1f5c0 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
1f5d0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
1f5e0 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c  e[i]);.      cel
1f5f0 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20  lptr += 2;.     
1f600 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69   cellbody += aSi
1f610 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  ze[i];.    }.   
1f620 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
1f630 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  y==pPage->pBt->u
1f640 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d  sableSize );.  }
1f650 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
1f660 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nCell;.}../*.*
1f670 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1f680 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
1f690 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
1f6a0 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
1f6b0 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
1f6c0 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
1f6d0 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
1f6e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
1f6f0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
1f700 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
1f710 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
1f720 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
1f730 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
1f740 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
1f750 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1f760 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
1f770 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
1f780 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
1f790 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
1f7a0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
1f7b0 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
1f7c0 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
1f7d0 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
1f7e0 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
1f7f0 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
1f800 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
1f810 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
1f820 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
1f830 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
1f840 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
1f850 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
1f860 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
1f870 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
1f880 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
1f890 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
1f8a0 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
1f8b0 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
1f8c0 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
1f8d0 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
1f8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f8f0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
1f900 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
1f910 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
1f920 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
1f930 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
1f940 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
1f950 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
1f960 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1f970 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
1f980 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
1f990 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e  ge*, int);..#ifn
1f9a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f9b0 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
1f9c0 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
1f9d0 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
1f9e0 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
1f9f0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
1fa00 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
1fa10 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
1fa20 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
1fa30 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
1fa40 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
1fa50 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
1fa60 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
1fa70 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
1fa80 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
1fa90 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
1faa0 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
1fab0 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68  rying balance th
1fac0 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
1fad0 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
1fae0 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
1faf0 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
1fb00 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
1fb10 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
1fb20 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
1fb30 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
1fb40 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
1fb50 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
1fb60 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
1fb70 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
1fb80 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
1fb90 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
1fba0 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
1fbb0 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
1fbc0 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
1fbd0 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
1fbe0 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
1fbf0 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
1fc00 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
1fc10 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
1fc20 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
1fc30 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
1fc40 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
1fc50 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
1fc60 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
1fc70 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
1fc80 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
1fc90 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
1fca0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
1fcb0 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
1fcc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fcd0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
1fce0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65  mPage *pPage, Me
1fcf0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b  mPage *pParent){
1fd00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
1fd10 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67  Page *pNew;.  Pg
1fd20 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38  no pgnoNew;.  u8
1fd30 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 73   *pCell;.  int s
1fd40 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66  zCell;.  CellInf
1fd50 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72  o info;.  BtShar
1fd60 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1fd70 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65  >pBt;.  int pare
1fd80 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d  ntIdx = pParent-
1fd90 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61  >nCell;   /* pPa
1fda0 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72  rent new divider
1fdb0 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
1fdc0 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b   int parentSize;
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65     /* Size of ne
1fdf0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
1fe00 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c  /.  u8 parentCel
1fe10 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20  l[64];          
1fe20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
1fe30 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  or the new divid
1fe40 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a  er cell */..  /*
1fe50 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1fe60 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65  page. Insert the
1fe70 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
1fe80 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69  rom pPage.  ** i
1fe90 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d  nto it. Then rem
1fea0 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ove the overflow
1feb0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
1fec0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
1fed0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1fee0 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
1fef0 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69  oNew, 0, 0);.  i
1ff00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ff10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1ff20 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d  c;.  }.  pCell =
1ff30 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
1ff40 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c  .pCell;.  szCell
1ff50 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
1ff60 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
1ff70 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
1ff80 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  Page->aData[0]);
1ff90 0a 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  .  assemblePage(
1ffa0 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
1ffb0 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61   &szCell);.  pPa
1ffc0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
1ffd0 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
1ffe0 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e   parent of the n
1fff0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
20000 61 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20  age to pParent. 
20010 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65  */.  pNew->pPare
20020 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  nt = pParent;.  
20030 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
20040 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
20050 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
20060 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20  s currently the 
20070 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
20080 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74  Parent. Change t
20090 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  his.  ** so that
200a0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
200b0 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65   is the new page
200c0 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65   allocated above
200d0 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20   and.  ** pPage 
200e0 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72  is the next-to-r
200f0 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a  ight child. .  *
20100 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
20110 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
20120 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
20130 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
20140 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69 74  Cell-1);.  sqlit
20150 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
20160 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
20170 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20 3d  , &info);.  rc =
20180 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
20190 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  ent, parentCell,
201a0 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
201b0 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53  , 0, 0, &parentS
201c0 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
201d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
201e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
201f0 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74    assert( parent
20200 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63 20  Size<64 );.  rc 
20210 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
20220 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c  rent, parentIdx,
20230 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72   parentCell, par
20240 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a  entSize, 0, 4);.
20250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20260 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
20270 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34  n rc;.  }.  put4
20280 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
20290 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61  wCell(pParent,pa
202a0 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d  rentIdx), pPage-
202b0 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79  >pgno);.  put4by
202c0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
202d0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
202e0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
202f0 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  w);..#ifndef SQL
20300 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
20310 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  UUM.  /* If this
20320 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
20330 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
20340 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
20350 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e  map.  ** with en
20360 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
20370 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
20380 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
20390 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74   .  ** cell on t
203a0 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
203b0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
203c0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
203d0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
203e0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
203f0 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
20400 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
20410 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  t->pgno);.    if
20420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20430 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20440 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
20450 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
20460 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 69  (pNew, 0);.    i
20470 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20480 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20490 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   rc;.    }.  }.#
204a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65  endif..  /* Rele
204b0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
204c0 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
204d0 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68  e and balance th
204e0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20  e parent page,. 
204f0 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
20500 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73  divider cell ins
20510 65 72 74 65 64 20 63 61 75 73 65 64 20 69 74 20  erted caused it 
20520 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  to become overfu
20530 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61  ll..  */.  relea
20540 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
20550 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70  return balance(p
20560 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65  Parent, 0);.}.#e
20570 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
20580 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
20590 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
205a0 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
205b0 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70  butes Cells on p
205c0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
205d0 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  N*2 siblings.** 
205e0 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74  of pPage so that
205f0 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
20600 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61  about the same a
20610 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
20620 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20  ace..** Usually 
20630 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
20640 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
20650 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74  age is used in t
20660 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a  he balancing,.**
20670 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62   though more sib
20680 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
20690 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69   from one side i
206a0 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66  f pPage is the f
206b0 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20  irst.** or last 
206c0 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
206d0 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68  ent.  If pPage h
206e0 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a  as fewer than 2*
206f0 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28  NN siblings.** (
20700 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
20710 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
20720 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
20730 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a  root page or a .
20740 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74  ** child of root
20750 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
20760 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61  able siblings pa
20770 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
20780 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
20790 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
207a0 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
207b0 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
207c0 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
207d0 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74  d by one or.** t
207e0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
207f0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
20800 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
20810 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65  t over full. The
20820 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
20830 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20   special and is 
20840 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65  allowed to be ne
20850 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70  arly empty. If p
20860 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20  Page is .** the 
20870 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
20880 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
20890 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69   tree might be i
208a0 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64  ncreased.** or d
208b0 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c  ecreased by one,
208c0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74   as necessary, t
208d0 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20  o keep the root 
208e0 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a  page from being.
208f0 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63  ** overfull or c
20900 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
20910 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
20920 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
20930 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
20940 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20  me of the Cells 
20950 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  on pPage.** migh
20960 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
20970 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  e stored in pPag
20980 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69  e->aData[].  Thi
20990 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
209a0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
209b0 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f  verfull.  Part o
209c0 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  f the job of thi
209d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a  s routine is to.
209e0 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** make sure all
209f0 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65   Cells for pPage
20a00 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20   once again fit 
20a10 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
20a20 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  ]..**.** In the 
20a30 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
20a40 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ing the siblings
20a50 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70   of pPage, the p
20a60 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a  arent of pPage.*
20a70 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f  * might become o
20a80 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
20a90 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68  full.  If that h
20aa0 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69  appens, then thi
20ab0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
20ac0 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
20ad0 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  ly on the parent
20ae0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
20af0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
20b00 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
20b10 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
20b20 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
20b30 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
20b40 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
20b50 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
20b60 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
20b70 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
20b80 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
20b90 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
20ba0 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ot(MemPage *pPag
20bb0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
20bc0 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Parent;         
20bd0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
20be0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42   of pPage */.  B
20bf0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
20c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20c10 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
20c20 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
20c30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20c40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20c50 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
20c60 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
20c70 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
20c80 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
20c90 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
20ca0 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
20cb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20ce0 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
20cf0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20d20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
20d30 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20   */.  int nDiv; 
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20d60 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d  cells in apDiv[]
20d70 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
20d80 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
20d90 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
20da0 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ers */.  int idx
20db0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20dc0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
20dd0 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72 65  f pPage in pPare
20de0 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
20df0 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20   int nxDiv;     
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20e10 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c   Next divider sl
20e20 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ot in pParent->a
20e30 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
20e40 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
20e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20e60 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
20e70 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74   int leafCorrect
20e80 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
20e90 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
20ea0 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74   leaf.  0 if not
20eb0 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61   */.  int leafDa
20ec0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
20ed0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
20ee0 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66  age is a leaf of
20ef0 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
20f00 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
20f10 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
20f20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70     /* Bytes in p
20f30 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20  Page beyond the 
20f40 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
20f50 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20  pageFlags;      
20f60 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
20f70 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
20f80 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75  a[0] */.  int su
20f90 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20  btotal;         
20fa0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74         /* Subtot
20fb0 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  al of bytes in c
20fc0 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65  ells on one page
20fd0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
20fe0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20ff0 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
21000 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
21010 65 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e[] */.  MemPage
21020 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
21030 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
21040 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
21050 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  lings */.  Pgno 
21060 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20  pgnoOld[NB];    
21070 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
21080 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
21090 20 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d   page in apOld[]
210a0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
210b0 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
210c0 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
210d0 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
210e0 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
210f0 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
21100 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
21110 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
21120 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
21130 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  ancing */.  Pgno
21140 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20   pgnoNew[NB+2]; 
21150 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
21160 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63   numbers for eac
21170 68 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b  h page in apNew[
21180 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  ] */.  u8 *apDiv
21190 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
211a0 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
211b0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
211c0 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
211d0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
211e0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
211f0 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
21200 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
21210 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
21220 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
21230 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
21240 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
21250 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
21260 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
21270 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
21280 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
21290 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
212a0 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  int *szCell;    
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
212c0 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
212d0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
212e0 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f  l[] */.  u8 *aCo
212f0 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
21300 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
21310 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  or holding data 
21320 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20  of apCopy[] */. 
21330 20 75 38 20 2a 61 53 70 61 63 65 3b 20 20 20 20   u8 *aSpace;    
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21350 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 63   Space to hold c
21360 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
21370 73 20 63 65 6c 6c 73 20 2a 2f 0a 23 69 66 6e 64  s cells */.#ifnd
21380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
21390 55 54 4f 56 41 43 55 55 4d 0a 20 20 75 38 20 2a  UTOVACUUM.  u8 *
213a0 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  aFrom = 0;.#endi
213b0 66 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69  f..  /* .  ** Fi
213c0 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nd the parent pa
213d0 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
213e0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
213f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
21400 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
21410 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
21420 50 61 67 65 29 20 29 3b 0a 20 20 70 42 74 20 3d  Page) );.  pBt =
21430 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70   pPage->pBt;.  p
21440 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
21450 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
21460 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20  t( pParent );.  
21470 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
21480 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21490 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
214a0 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
214b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
214c0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
214d0 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
214e0 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
214f0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
21500 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  arent->pgno));..
21510 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21520 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
21530 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65  .  /*.  ** A spe
21540 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61  cial case:  If a
21550 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a   new entry has j
21560 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ust been inserte
21570 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61  d into a.  ** ta
21580 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20  ble (that is, a 
21590 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67  btree with integ
215a0 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20  er keys and all 
215b0 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76  data at the leav
215c0 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  es).  ** and the
215d0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68   new entry is th
215e0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
215f0 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28  ry in the tree (
21600 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20  it has the.  ** 
21610 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65  largest key) the
21620 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61  n use the specia
21630 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
21640 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20  ) routine for.  
21650 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62  ** balancing.  b
21660 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
21670 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e  s much faster an
21680 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  d results in a t
21690 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b  ighter.  ** pack
216a0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74  ing of data in t
216b0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
216c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
216d0 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20  ->leaf &&.      
216e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
216f0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65  .      pPage->le
21700 61 66 44 61 74 61 20 26 26 0a 20 20 20 20 20 20  afData &&.      
21710 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
21720 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61  ==1 &&.      pPa
21730 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
21740 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26  ==pPage->nCell &
21750 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  &.      pPage->p
21760 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20  Parent->pgno!=1 
21770 26 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74  &&.      get4byt
21780 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
21790 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
217a0 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d  fset+8])==pPage-
217b0 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f  >pgno.  ){.    /
217c0 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43  *.    ** TODO: C
217d0 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67  heck the sibling
217e0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
217f0 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62   pPage. It may b
21800 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
21810 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20  ey are not full 
21820 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20  and no new page 
21830 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
21840 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62   */.    return b
21850 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61  alance_quick(pPa
21860 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
21870 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
21880 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c   ** Find the cel
21890 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  l in the parent 
218a0 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20  page whose left 
218b0 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63  child points bac
218c0 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e  k.  ** to pPage.
218d0 20 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69    The "idx" vari
218e0 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65  able is the inde
218f0 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20  x of that cell. 
21900 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69   If pPage.  ** i
21910 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  s the rightmost 
21920 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
21930 20 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f   then set idx to
21940 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
21950 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
21960 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b  ent->idxShift ){
21970 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
21980 20 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65      pgno = pPage
21990 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
219a0 72 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  rt( pgno==sqlite
219b0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
219c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
219d0 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d   );.    for(idx=
219e0 30 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e  0; idx<pParent->
219f0 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20  nCell; idx++){. 
21a00 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
21a10 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
21a20 6e 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20  nt, idx))==pgno 
21a30 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
21a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21a50 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c      assert( idx<
21a60 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20  pParent->nCell. 
21a70 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67              || g
21a80 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
21a90 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
21aa0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
21ab0 70 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno );.  }else{
21ac0 0a 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65  .    idx = pPage
21ad0 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d  ->idxParent;.  }
21ae0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74  ..  /*.  ** Init
21af0 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73  ialize variables
21b00 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
21b10 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70   be safe to jump
21b20 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74  .  ** directly t
21b30 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
21b40 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e  p at any moment.
21b50 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e  .  */.  nOld = n
21b60 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  New = 0;.  sqlit
21b70 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
21b80 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20  nt->pDbPage);.. 
21b90 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69   /*.  ** Find si
21ba0 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70  bling pages to p
21bb0 50 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c  Page and the cel
21bc0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68  ls in pParent th
21bd0 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74  at divide.  ** t
21be0 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e  he siblings.  An
21bf0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
21c00 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c   to find NN sibl
21c10 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20  ings on either. 
21c20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67   ** side of pPag
21c30 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67  e.  More sibling
21c40 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d  s are taken from
21c50 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76   one side, howev
21c60 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67  er, if.  ** pPag
21c70 65 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65  e there are fewe
21c80 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e  r than NN siblin
21c90 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20  gs on the other 
21ca0 73 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e  side.  If pParen
21cb0 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72  t.  ** has NB or
21cc0 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20   fewer children 
21cd0 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  then all childre
21ce0 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65  n of pParent are
21cf0 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e   taken..  */.  n
21d00 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b  xDiv = idx - NN;
21d10 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e  .  if( nxDiv + N
21d20 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  B > pParent->nCe
21d30 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  ll ){.    nxDiv 
21d40 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  = pParent->nCell
21d50 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20   - NB + 1;.  }. 
21d60 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a   if( nxDiv<0 ){.
21d70 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
21d80 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20   }.  nDiv = 0;. 
21d90 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69   for(i=0, k=nxDi
21da0 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b  v; i<NB; i++, k+
21db0 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50  +){.    if( k<pP
21dc0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
21dd0 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
21de0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
21df0 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69  t, k);.      nDi
21e00 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  v++;.      asser
21e10 74 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61  t( !pParent->lea
21e20 66 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f  f );.      pgnoO
21e30 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65  ld[i] = get4byte
21e40 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
21e50 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61  }else if( k==pPa
21e60 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
21e70 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20       pgnoOld[i] 
21e80 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  = get4byte(&pPar
21e90 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
21ea0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
21eb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21ec0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21ed0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
21ee0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
21ef0 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64  noOld[i], &apOld
21f00 5b 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20  [i], pParent);. 
21f10 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
21f20 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
21f30 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e  ;.    apOld[i]->
21f40 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20  idxParent = k;. 
21f50 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30     apCopy[i] = 0
21f60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  ;.    assert( i=
21f70 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c  =nOld );.    nOl
21f80 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c  d++;.    nMaxCel
21f90 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d  ls += 1+apOld[i]
21fa0 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d  ->nCell+apOld[i]
21fb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d  ->nOverflow;.  }
21fc0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
21fd0 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
21fe0 20 6f 66 20 32 20 69 6e 20 6f 72 64 65 72 20 74   of 2 in order t
21ff0 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
22000 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
22010 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
22020 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 31  = (nMaxCells + 1
22030 29 26 7e 31 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~1;..  /*.  **
22040 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
22050 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
22060 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70 43  tures.  */.  apC
22070 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ell = sqliteMall
22080 6f 63 52 61 77 28 20 0a 20 20 20 20 20 20 20 6e  ocRaw( .       n
22090 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
220a0 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
220c0 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
220d0 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
220e0 65 6f 66 28 69 6e 74 29 20 20 20 20 20 20 20 20  eof(int)        
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22100 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a     /* szCell */.
22110 20 20 20 20 20 2b 20 52 4f 55 4e 44 38 28 73 69       + ROUND8(si
22120 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2a 4e  zeof(MemPage))*N
22130 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  B               
22140 20 20 20 20 20 20 20 2f 2a 20 61 43 6f 70 79 20         /* aCopy 
22150 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70  */.     + pBt->p
22160 61 67 65 53 69 7a 65 2a 28 35 2b 4e 42 29 20 20  ageSize*(5+NB)  
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
22190 61 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49  ace */.     + (I
221a0 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d  SAUTOVACUUM ? nM
221b0 61 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20  axCells : 0)    
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
221d0 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20   aFrom */.  );. 
221e0 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
221f0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
22200 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
22210 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
22220 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
22230 3d 20 28 69 6e 74 2a 29 26 61 70 43 65 6c 6c 5b  = (int*)&apCell[
22240 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43  nMaxCells];.  aC
22250 6f 70 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73  opy[0] = (u8*)&s
22260 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  zCell[nMaxCells]
22270 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 61 43  ;.  assert( ((aC
22280 6f 70 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70  opy[0] - (u8*)ap
22290 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
222a0 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
222b0 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
222c0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42  .  for(i=1; i<NB
222d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70  ; i++){.    aCop
222e0 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d  y[i] = &aCopy[i-
222f0 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1][pBt->pageSize
22300 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d  +ROUND8(sizeof(M
22310 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61  emPage))];.    a
22320 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69  ssert( ((aCopy[i
22330 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  ] - (u8*)apCell)
22340 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
22350 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
22360 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a  required */.  }.
22370 20 20 61 53 70 61 63 65 20 3d 20 26 61 43 6f 70    aSpace = &aCop
22380 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  y[NB-1][pBt->pag
22390 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
223a0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
223b0 20 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61    assert( ((aSpa
223c0 63 65 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  ce - (u8*)apCell
223d0 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
223e0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
223f0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66   required */.#if
22400 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22410 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
22420 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
22430 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d  m ){.    aFrom =
22440 20 26 61 53 70 61 63 65 5b 35 2a 70 42 74 2d 3e   &aSpace[5*pBt->
22450 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23  pageSize];.  }.#
22460 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 0a 20 20  endif.  .  /*.  
22470 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  ** Make copies o
22480 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  f the content of
22490 20 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73   pPage and its s
224a0 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c  iblings into aOl
224b0 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65  d[]..  ** The re
224c0 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
224d0 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
224e0 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
224f0 73 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68  s rather.  ** th
22500 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
22510 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
22520 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
22530 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
22540 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
22550 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
22560 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
22570 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
22580 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20     MemPage *p = 
22590 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
225a0 50 61 67 65 2a 29 26 61 43 6f 70 79 5b 69 5d 5b  Page*)&aCopy[i][
225b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a  pBt->pageSize];.
225c0 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26      p->aData = &
225d0 28 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70  ((u8*)p)[-pBt->p
225e0 61 67 65 53 69 7a 65 5d 3b 0a 20 20 20 20 6d 65  ageSize];.    me
225f0 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61  mcpy(p->aData, a
22600 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20  pOld[i]->aData, 
22610 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
22620 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
22630 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d  ;.    /* The mem
22640 63 70 79 28 29 20 61 62 6f 76 65 20 63 68 61 6e  cpy() above chan
22650 67 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ges the value of
22660 20 70 2d 3e 61 44 61 74 61 20 73 6f 20 77 65 20   p->aData so we 
22670 68 61 76 65 20 74 6f 0a 20 20 20 20 2a 2a 20 73  have to.    ** s
22680 65 74 20 69 74 20 61 67 61 69 6e 2e 20 2a 2f 0a  et it again. */.
22690 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 26      p->aData = &
226a0 28 28 75 38 2a 29 70 29 5b 2d 70 42 74 2d 3e 70  ((u8*)p)[-pBt->p
226b0 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 0a 20  ageSize];.  }.. 
226c0 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f   /*.  ** Load po
226d0 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65  inters to all ce
226e0 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70  lls on sibling p
226f0 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76  ages and the div
22700 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
22710 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61  into the local a
22720 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20  pCell[] array.  
22730 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
22740 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
22750 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65  .  ** into space
22760 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61   obtained form a
22770 53 70 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f  Space[] and remo
22780 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
22790 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
227a0 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
227b0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
227c0 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
227d0 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
227e0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
227f0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
22800 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
22810 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
22820 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
22830 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
22840 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d  ** into aSpace[]
22850 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
22860 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
22870 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
22880 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
22890 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
228a0 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
228b0 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
228c0 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
228d0 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
228e0 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
228f0 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
22900 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
22910 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
22920 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
22930 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
22940 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
22950 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
22960 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
22970 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
22980 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
22990 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
229a0 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
229b0 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43   keys..  */.  nC
229c0 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43  ell = 0;.  leafC
229d0 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67  orrection = pPag
229e0 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  e->leaf*4;.  lea
229f0 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  fData = pPage->l
22a00 65 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65  eafData && pPage
22a10 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d  ->leaf;.  for(i=
22a20 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
22a30 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
22a40 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a  ld = apCopy[i];.
22a50 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
22a60 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
22a70 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
22a80 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
22a90 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61  t; j++){.      a
22aa0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
22ab0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
22ac0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
22ad0 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
22ae0 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20  (pOld, j);.     
22af0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
22b00 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
22b10 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
22b20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
22b30 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
22b40 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  M.      if( pBt-
22b50 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
22b60 20 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20         int a;.  
22b70 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
22b80 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  l] = i;.        
22b90 66 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d  for(a=0; a<pOld-
22ba0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29  >nOverflow; a++)
22bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
22bc0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70  pOld->aOvfl[a].p
22bd0 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65  Cell==apCell[nCe
22be0 6c 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ll] ){.         
22bf0 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
22c00 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
22c10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22c30 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
22c40 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
22c50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e     }.    if( i<n
22c60 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  Old-1 ){.      i
22c70 6e 74 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65  nt sz = cellSize
22c80 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
22c90 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  iv[i]);.      if
22ca0 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
22cb0 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68        /* With th
22cc0 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c  e LEAFDATA flag,
22cd0 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68   pParent cells h
22ce0 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73  old only INTKEYs
22cf0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
22d00 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20   are duplicates 
22d10 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63  of keys on the c
22d20 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20  hild pages.  We 
22d30 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20  need to remove. 
22d40 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69         ** the di
22d50 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
22d60 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68   pParent, but th
22d70 65 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  e dividers cells
22d80 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20   are not.       
22d90 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43   ** added to apC
22da0 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68  ell[] because th
22db0 65 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ey are duplicate
22dc0 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73  s of child cells
22dd0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
22de0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
22df0 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
22e00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
22e10 20 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d          u8 *pTem
22e20 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
22e30 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
22e40 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  ls );.        sz
22e50 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
22e60 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
22e70 3d 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65  = &aSpace[iSpace
22e80 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63  ];.        iSpac
22e90 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  e += sz;.       
22ea0 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c   assert( iSpace<
22eb0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35  =pBt->pageSize*5
22ec0 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   );.        memc
22ed0 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
22ee0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20  i], sz);.       
22ef0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
22f00 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65   pTemp+leafCorre
22f10 63 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53  ction;.#ifndef S
22f20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
22f30 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66  ACUUM.        if
22f40 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
22f50 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  m ){.          a
22f60 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78  From[nCell] = 0x
22f70 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  FF;.        }.#e
22f80 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f  ndif.        dro
22f90 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
22fa0 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
22fb0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
22fc0 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69   -= leafCorrecti
22fd0 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  on;.        asse
22fe0 72 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65  rt( get4byte(pTe
22ff0 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20  mp)==pgnoOld[i] 
23000 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
23010 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pOld->leaf ){.  
23020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23030 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
23040 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 );.          /
23050 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
23060 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
23070 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
23080 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
23090 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
230a0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
230b0 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  cell */.        
230c0 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b    memcpy(apCell[
230d0 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61  nCell], &pOld->a
230e0 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66  Data[pOld->hdrOf
230f0 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20  fset+8], 4);.   
23100 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
23120 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
23130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
23140 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34   szCell[nCell]<4
23150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23160 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
23170 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65  any cells smalle
23180 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20  r than 4 bytes. 
23190 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  */.            s
231a0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
231b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
231c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
231d0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
231e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
231f0 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74  .  ** Figure out
23200 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
23210 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68  ages needed to h
23220 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65  old all nCell ce
23230 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20  lls..  ** Store 
23240 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22  this number in "
23250 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74  k".  Also comput
23260 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20  e szNew[] which 
23270 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a  is the total.  *
23280 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  * size of all ce
23290 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  lls on the i-th 
232a0 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b  page and cntNew[
232b0 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  ] which is the i
232c0 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43  ndex.  ** in apC
232d0 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c  ell[] of the cel
232e0 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70  l that divides p
232f0 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20  age i from page 
23300 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e  i+1.  .  ** cntN
23310 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75  ew[k] should equ
23320 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20  al nCell..  **. 
23330 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75   ** Values compu
23340 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
23350 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  k:.  **.  **    
23360 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f         k: The to
23370 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  tal number of si
23380 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a  bling pages.  **
23390 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70      szNew[i]: Sp
233a0 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65  aced used on the
233b0 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
233c0 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65  ge..  **   cntNe
233d0 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61  w[i]: Index in a
233e0 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65  pCell[] and szCe
233f0 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72  ll[] for the fir
23400 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20  st cell to.  ** 
23410 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
23420 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d   right of the i-
23430 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
23440 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63  .  ** usableSpac
23450 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  e: Number of byt
23460 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69  es of space avai
23470 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69  lable on each si
23480 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a  bling..  ** .  *
23490 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20  /.  usableSpace 
234a0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
234b0 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72  e - 12 + leafCor
234c0 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73  rection;.  for(s
234d0 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69  ubtotal=k=i=0; i
234e0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
234f0 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78    assert( i<nMax
23500 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62  Cells );.    sub
23510 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b  total += szCell[
23520 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20  i] + 2;.    if( 
23530 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c  subtotal > usabl
23540 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eSpace ){.      
23550 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
23560 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  tal - szCell[i];
23570 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d  .      cntNew[k]
23580 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20   = i;.      if( 
23590 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b  leafData ){ i--;
235a0 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61   }.      subtota
235b0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b  l = 0;.      k++
235c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  ;.    }.  }.  sz
235d0 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
235e0 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
235f0 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
23600 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
23610 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
23620 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
23630 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
23640 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
23650 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
23660 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
23670 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
23680 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
23690 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
236a0 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
236b0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
236c0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
236d0 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
236e0 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
236f0 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
23700 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
23710 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
23720 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
23730 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
23740 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
23750 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
23760 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
23770 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
23780 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
23790 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
237a0 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
237b0 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
237c0 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
237d0 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
237e0 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
237f0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
23800 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
23810 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
23820 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
23830 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
23840 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
23850 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
23860 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
23870 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
23880 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
23890 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
238a0 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
238b0 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
238c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
238d0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
238e0 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
238f0 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
23900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
23910 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
23920 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
23930 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
23940 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
23950 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
23960 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
23970 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
23980 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
23990 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
239a0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
239b0 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
239c0 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   || szRight+szCe
239d0 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
239e0 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b  (szCell[r]+2) ){
239f0 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
23a00 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
23a10 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
23a20 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
23a30 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
23a40 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
23a50 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
23a60 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
23a70 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
23a80 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
23a90 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
23aa0 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
23ab0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
23ac0 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
23ad0 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
23ae0 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
23af0 20 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a   we are the.  **
23b00 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
23b10 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
23b20 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
23b30 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
23b40 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
23b50 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
23b60 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
23b70 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
23b80 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e  /.  assert( cntN
23b90 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72  ew[0]>0 || (pPar
23ba0 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20  ent->pgno==1 && 
23bb0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
23bc0 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  0) );..  /*.  **
23bd0 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20   Allocate k new 
23be0 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c  pages.  Reuse ol
23bf0 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f  d pages where po
23c00 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  ssible..  */.  a
23c10 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
23c20 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c  no>1 );.  pageFl
23c30 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ags = pPage->aDa
23c40 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
23c50 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
23c60 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
23c70 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
23c80 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
23c90 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
23ca0 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
23cb0 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69  w[i] = pgnoOld[i
23cc0 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69  ];.      apOld[i
23cd0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  ] = 0;.      rc 
23ce0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
23cf0 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ite(pNew->pDbPag
23d00 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  e);.      nNew++
23d10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
23d20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
23d30 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
23d40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23d50 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
23d60 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
23d70 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
23d80 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e  &pgnoNew[i], pgn
23d90 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20  oNew[i-1], 0);. 
23da0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
23db0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
23dc0 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  up;.      apNew[
23dd0 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  i] = pNew;.     
23de0 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nNew++;.    }. 
23df0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
23e00 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20  , pageFlags);.  
23e10 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
23e20 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
23e30 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
23e40 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
23e50 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
23e60 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ld ){.    rc = f
23e70 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
23e80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
23e90 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
23ea0 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
23eb0 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
23ec0 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
23ed0 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
23ee0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
23ef0 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
23f00 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
23f10 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
23f20 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
23f30 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
23f40 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
23f50 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
23f60 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
23f70 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
23f80 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
23f90 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
23fa0 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
23fb0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
23fc0 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
23fd0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
23fe0 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
23ff0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
24000 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
24010 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
24020 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
24030 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
24040 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
24050 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
24060 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
24070 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
24080 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
24090 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
240a0 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
240b0 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
240c0 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
240d0 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
240e0 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
240f0 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
24100 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
24110 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
24120 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77  t minV = pgnoNew
24130 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  [i];.    int min
24140 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
24150 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
24160 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e  .      if( pgnoN
24170 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29  ew[j]<(unsigned)
24180 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20  minV ){.        
24190 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20  minI = j;.      
241a0 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77    minV = pgnoNew
241b0 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [j];.      }.   
241c0 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e   }.    if( minI>
241d0 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  i ){.      int t
241e0 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  ;.      MemPage 
241f0 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70  *pT;.      t = p
24200 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20  gnoNew[i];.     
24210 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
24220 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d        pgnoNew[i]
24230 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d   = pgnoNew[minI]
24240 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
24250 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
24260 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69        pgnoNew[mi
24270 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61  nI] = t;.      a
24280 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
24290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
242a0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c  CE(("BALANCE: ol
242b0 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77  d: %d %d %d  new
242c0 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
242d0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
242e0 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e  (%d)\n",.    pgn
242f0 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f  oOld[0], .    nO
24300 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b  ld>=2 ? pgnoOld[
24310 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  1] : 0,.    nOld
24320 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d  >=3 ? pgnoOld[2]
24330 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65   : 0,.    pgnoNe
24340 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  w[0], szNew[0],.
24350 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67      nNew>=2 ? pg
24360 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e  noNew[1] : 0, nN
24370 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d  ew>=2 ? szNew[1]
24380 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
24390 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a  3 ? pgnoNew[2] :
243a0 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a   0, nNew>=3 ? sz
243b0 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  New[2] : 0,.    
243c0 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65  nNew>=4 ? pgnoNe
243d0 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[3] : 0, nNew>=
243e0 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
243f0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
24400 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20  pgnoNew[4] : 0, 
24410 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
24420 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a  4] : 0));..  /*.
24430 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
24440 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
24450 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
24460 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
24470 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
24480 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
24490 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
244a0 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
244b0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
244c0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
244d0 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
244e0 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
244f0 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
24500 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
24510 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
24520 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
24530 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
24540 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b  ->pgno==pgnoNew[
24550 69 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  i] );.    assemb
24560 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
24570 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
24580 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
24590 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
245a0 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
245b0 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
245c0 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
245d0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
245e0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
245f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24600 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
24610 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
24620 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
24630 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
24640 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
24650 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
24660 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  that point to th
24670 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20  e siblings that 
24680 77 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e  were rearranged.
24690 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c   These can be: l
246a0 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  eft.    ** child
246b0 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68  ren of cells, th
246c0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
246d0 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76   the page, or ov
246e0 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20  erflow pages.   
246f0 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
24700 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a  y cells..    */.
24710 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
24720 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
24730 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e   for(k=j; k<cntN
24740 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ew[i]; k++){.   
24750 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
24760 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
24770 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d      if( aFrom[k]
24780 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79  ==0xFF || apCopy
24790 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f  [aFrom[k]]->pgno
247a0 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a  !=pNew->pgno ){.
247b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
247c0 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65  trmapPutOvfl(pNe
247d0 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20  w, k-j);.       
247e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
247f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
24800 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
24810 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
24820 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
24840 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e  ndif..    j = cn
24850 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a  tNew[i];..    /*
24860 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
24870 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
24880 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65  bove was not the
24890 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
248a0 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65  ing,.    ** inse
248b0 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  rt a divider cel
248c0 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  l into the paren
248d0 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
248e0 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20     if( i<nNew-1 
248f0 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20  && j<nCell ){.  
24900 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
24910 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
24920 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20        int sz;.. 
24930 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
24940 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
24950 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c    pCell = apCell
24960 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20  [j];.      sz = 
24970 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66  szCell[j] + leaf
24980 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
24990 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
249a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
249b0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
249c0 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
249d0 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
249e0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
249f0 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 09  f( leafData ){..
24a00 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20 69  /* If the tree i
24a10 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  s a leaf-data tr
24a20 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c  ee, and the sibl
24a30 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c  ings are leaves,
24a40 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
24a50 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69  n there is no di
24a60 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70  vider cell in ap
24a70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c  Cell[]. Instead,
24a80 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20 20   the divider .  
24a90 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f        ** cell co
24aa0 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
24ab0 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68  teger key for th
24ac0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  e right-most cel
24ad0 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a  l of .        **
24ae0 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67   the sibling-pag
24af0 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
24b00 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20  e only..        
24b10 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  */.        CellI
24b20 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
24b30 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73    j--;.        s
24b40 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
24b50 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
24b60 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
24b70 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
24b80 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
24b90 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e  ;.        fillIn
24ba0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43  Cell(pParent, pC
24bb0 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
24bc0 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29  y, 0, 0, 0, &sz)
24bd0 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
24be0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
24bf0 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
24c00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
24c10 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
24c20 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
24c30 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
24c40 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 70   -= 4;.        p
24c50 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 5b 69  Temp = &aSpace[i
24c60 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
24c70 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
24c80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
24c90 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
24ca0 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
24cb0 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
24cc0 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
24cd0 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
24ce0 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
24cf0 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
24d00 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
24d10 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
24d20 61 6e 64 20 69 74 27 73 20 72 65 70 6f 72 74 65  and it's reporte
24d30 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20  d size was 4.   
24d40 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74       ** bytes, t
24d50 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61  hen it may actua
24d60 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  lly be smaller t
24d70 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20  han this .      
24d80 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65    ** (see sqlite
24d90 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
24da0 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
24db0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
24dc0 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
24dd0 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
24de0 74 27 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  t's important to
24df0 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
24e00 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
24e10 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
24e20 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
24e30 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
24e40 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
24e50 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
24e60 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
24e70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
24e80 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
24e90 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
24ea0 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
24eb0 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
24ec0 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
24ed0 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
24ee0 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
24ef0 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
24f00 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
24f10 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
24f20 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
24f30 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
24f40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
24f50 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
24f60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
24f70 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
24f80 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
24f90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24fa0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65  .      rc = inse
24fb0 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
24fc0 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
24fd0 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20  , pTemp, 4);.   
24fe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24ff0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
25000 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
25010 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
25020 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
25030 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65  rent,nxDiv), pNe
25040 77 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  w->pgno);.#ifnde
25050 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25060 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
25070 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
25080 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
25090 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20  base, and not a 
250a0 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a  leaf-data tree,.
250b0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70        ** then up
250c0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
250d0 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74   map with an ent
250e0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
250f0 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
25100 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20  * that the cell 
25110 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f  just inserted po
25120 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29  ints to (if any)
25130 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25140 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
25150 63 75 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74  cuum && !leafDat
25160 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  a ){.        rc 
25170 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
25180 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b  pParent, nxDiv);
25190 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
251a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
251b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
251c0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
251d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
251e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b  #endif.      j++
251f0 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
25200 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
25210 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
25220 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
25230 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
25240 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
25250 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
25260 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
25270 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e  memcpy(&apNew[nN
25280 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ew-1]->aData[8],
25290 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d   &apCopy[nOld-1]
252a0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
252b0 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d    }.  if( nxDiv=
252c0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b  =pParent->nCell+
252d0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
252e0 6f 77 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67  ow ){.    /* Rig
252f0 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
25300 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
25310 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t child of pPare
25320 6e 74 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  nt */.    put4by
25330 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
25340 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
25350 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
25360 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65  w[nNew-1]);.  }e
25370 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68  lse{.    /* Righ
25380 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69  t-most sibling i
25390 73 20 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64  s the left child
253a0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 65 6e   of the first en
253b0 74 72 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20  try in pParent. 
253c0 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72     ** past the r
253d0 69 67 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65  ight-most divide
253e0 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70  r entry */.    p
253f0 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72  ut4byte(findOver
25400 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74  flowCell(pParent
25410 2c 20 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65  , nxDiv), pgnoNe
25420 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a  w[nNew-1]);.  }.
25430 0a 20 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72  .  /*.  ** Repar
25440 65 6e 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  ent children of 
25450 61 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a  all cells..  */.
25460 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
25470 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  w; i++){.    rc 
25480 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50  = reparentChildP
25490 61 67 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  ages(apNew[i]);.
254a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
254b0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
254c0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
254d0 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e  }.  rc = reparen
254e0 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72  tChildPages(pPar
254f0 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
25500 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
25510 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
25520 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c  ;..  /*.  ** Bal
25530 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74 20  ance the parent 
25540 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  page.  Note that
25550 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
25560 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a  e (pPage) might.
25570 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61    ** have been a
25580 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
25590 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74  list so it might
255a0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e   no longer be in
255b0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
255c0 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  But the parent p
255d0 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  age will always 
255e0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a  be initialized..
255f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
25600 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
25610 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  ;.  rc = balance
25620 28 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20  (pParent, 0);.  
25630 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e  .  /*.  ** Clean
25640 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  up before return
25650 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63  ing..  */.balanc
25660 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c  e_cleanup:.  sql
25670 69 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  iteFree(apCell);
25680 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
25690 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
256a0 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
256b0 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
256c0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
256d0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
256e0 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
256f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
25700 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45  Parent);.  TRACE
25710 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69  (("BALANCE: fini
25720 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c  shed with %d: ol
25730 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
25740 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
25750 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20     pPage->pgno, 
25760 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
25770 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  l));.  return rc
25780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
25790 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
257a0 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  d for the root p
257b0 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20 77  age of a btree w
257c0 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  hen the root.** 
257d0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
257e0 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73   cells.  This is
257f0 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
25800 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65  to make the tree
25810 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79  .** shallower by
25820 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73   one level..*/.s
25830 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
25840 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50  e_shallower(MemP
25850 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
25860 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
25870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25880 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61  he only child pa
25890 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20  ge of pPage */. 
258a0 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
258c0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
258d0 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74   pChild */.  int
258e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
258f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25900 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
25910 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
25920 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25940 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72   /* The main BTr
25950 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
25960 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50    int mxCellPerP
25970 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
25980 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
25990 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61   of cells per pa
259a0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
259b0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
259c0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
259d0 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69  s from pages bei
259e0 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
259f0 20 69 6e 74 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   int *szCell;   
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a10 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
25a20 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61  ll cells */..  a
25a30 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
25a40 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
25a50 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
25a60 6c 6c 3d 3d 30 20 29 3b 0a 20 20 70 42 74 20 3d  ll==0 );.  pBt =
25a70 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d   pPage->pBt;.  m
25a80 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d  xCellPerPage = M
25a90 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61  X_CELL(pBt);.  a
25aa0 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61  pCell = sqliteMa
25ab0 6c 6c 6f 63 52 61 77 28 20 6d 78 43 65 6c 6c 50  llocRaw( mxCellP
25ac0 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75  erPage*(sizeof(u
25ad0 38 2a 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  8*)+sizeof(int))
25ae0 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c   );.  if( apCell
25af0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
25b00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43  ITE_NOMEM;.  szC
25b10 65 6c 6c 20 3d 20 28 69 6e 74 2a 29 26 61 70 43  ell = (int*)&apC
25b20 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67  ell[mxCellPerPag
25b30 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  e];.  if( pPage-
25b40 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20  >leaf ){.    /* 
25b50 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  The table is com
25b60 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f  pletely empty */
25b70 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
25b80 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c  ANCE: empty tabl
25b90 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  e %d\n", pPage->
25ba0 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pgno));.  }else{
25bb0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74  .    /* The root
25bc0 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62   page is empty b
25bd0 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64  ut has one child
25be0 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a  .  Transfer the.
25bf0 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69      ** informati
25c00 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65  on from that one
25c10 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20   child into the 
25c20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20  root page if it 
25c30 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74  .    ** will fit
25c40 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20  .  This reduces 
25c50 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
25c60 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20   tree by one..  
25c70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
25c80 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
25c90 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c  page 1, it has l
25ca0 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61  ess space availa
25cb0 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ble than.    ** 
25cc0 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74  its child (due t
25cd0 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68  o the 100 byte h
25ce0 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72  eader that occur
25cf0 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
25d00 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ng.    ** of the
25d10 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20   database fle), 
25d20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  so it might not 
25d30 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  be able to hold 
25d40 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20  all of the .    
25d50 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  ** information c
25d60 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
25d70 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e  ed in the child.
25d80 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65    If this is the
25d90 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74   .    ** case, t
25da0 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  hen do not do th
25db0 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61  e transfer.  Lea
25dc0 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20  ve page 1 empty 
25dd0 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
25de0 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
25df0 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64  ter to the child
25e00 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c   page.  The chil
25e10 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20  d page becomes. 
25e20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61     ** the virtua
25e30 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  l root of the tr
25e40 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ee..    */.    p
25e50 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
25e60 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
25e70 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
25e80 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
25e90 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20  rt( pgnoChild>0 
25ea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
25eb0 67 6e 6f 43 68 69 6c 64 3c 3d 73 71 6c 69 74 65  gnoChild<=sqlite
25ec0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
25ed0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
25ee0 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
25ef0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
25f00 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  age(pPage->pBt, 
25f10 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68 69  pgnoChild, &pChi
25f20 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ld, 0);.    if( 
25f30 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68  rc ) goto end_sh
25f40 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
25f50 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 67     if( pPage->pg
25f60 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  no==1 ){.      r
25f70 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
25f80 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c  InitPage(pChild,
25f90 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69   pPage);.      i
25fa0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
25fb0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
25fc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
25fd0 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
25fe0 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  w==0 );.      if
25ff0 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e  ( pChild->nFree>
26000 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
26010 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66  /* The child inf
26020 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69  ormation will fi
26030 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  t on the root pa
26040 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20  ge, so do the.  
26050 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f        ** copy */
26060 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
26070 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65          zeroPage
26080 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
26090 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
260a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
260b0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
260c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
260d0 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  ell[i] = findCel
260e0 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20  l(pChild,i);.   
260f0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d         szCell[i]
26100 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
26110 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d  Child, apCell[i]
26120 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26130 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67       assemblePag
26140 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
26150 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20  >nCell, apCell, 
26160 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20  szCell);.       
26170 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67   /* Copy the rig
26180 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht-pointer of th
26190 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70  e child to the p
261a0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
261b0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
261c0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
261d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a 20  hdrOffset+8], . 
261e0 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
261f0 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44 61  yte(&pChild->aDa
26200 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f 66  ta[pChild->hdrOf
26210 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
26220 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69     freePage(pChi
26230 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ld);.        TRA
26240 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
26250 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20  ild %d transfer 
26260 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  to page 1\n", pC
26270 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
26280 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26290 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
262a0 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  has more informa
262b0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66  tion that will f
262c0 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a  it on the root..
262d0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74          ** The t
262e0 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62  ree is already b
262f0 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74  alanced.  Do not
26300 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20  hing. */.       
26310 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
26320 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20  : child %d will 
26330 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20  not fit on page 
26340 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
26350 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
26360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
26370 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61  emcpy(pPage->aDa
26380 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ta, pChild->aDat
26390 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  a, pPage->pBt->u
263a0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
263b0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
263c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
263d0 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20  ->pParent = 0;. 
263e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
263f0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
26400 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Page, 0);.      
26410 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
26420 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 66  TE_OK );.      f
26430 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  reePage(pChild);
26440 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42  .      TRACE(("B
26450 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65 72  ALANCE: transfer
26460 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20 72   child %d into r
26470 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  oot %d\n",.     
26480 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64 2d           pChild-
26490 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70 67  >pgno, pPage->pg
264a0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
264b0 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69  rc = reparentChi
264c0 6c 64 50 61 67 65 73 28 70 50 61 67 65 29 3b 0a  ldPages(pPage);.
264d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
264e0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
264f0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
26500 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26510 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
26520 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
26530 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
26540 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
26550 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a  ->nCell; i++){ .
26560 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
26570 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67 65  mapPutOvfl(pPage
26580 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , i);.        if
26590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
265a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
265b0 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
265c0 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 7d  lance;.        }
265d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
265e0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
265f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
26600 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
26610 61 6c 61 6e 63 65 3b 0a 20 20 20 20 72 65 6c 65  alance;.    rele
26620 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
26630 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77  .  }.end_shallow
26640 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69  _balance:.  sqli
26650 74 65 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  teFree(apCell);.
26660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26670 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20  ./*.** The root 
26680 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
26690 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
266a0 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65   happens, Create
266b0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
266c0 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a  e and copy the.*
266d0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
266e0 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20  e root into the 
266f0 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b  child.  Then mak
26700 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  e the root.** pa
26710 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  ge an empty page
26720 20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64   with rightChild
26730 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
26740 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20   new.** child.  
26750 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62   Finally, call b
26760 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28  alance_internal(
26770 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69  ) on the new chi
26780 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69  ld.** to cause i
26790 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73  t to split..*/.s
267a0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
267b0 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
267c0 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
267d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
267e0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
267f0 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
26800 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
26810 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20 50  *pChild;    /* P
26820 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
26830 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
26840 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20  Pgno pgnoChild; 
26850 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
26860 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  er of the new ch
26870 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74  ild page */.  Bt
26880 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
26890 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65       /* The BTre
268a0 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
268b0 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54 6f  eSize;     /* To
268c0 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65 20  tal usable size 
268d0 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 75  of a page */.  u
268e0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
268f0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
26900 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
26910 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61 3b   */.  u8 *cdata;
26920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
26930 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69 6c  tent of the chil
26940 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
26950 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
26960 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61 67  /* Offset to pag
26970 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72 65  e header in pare
26980 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b  nt */.  int brk;
26990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
269a0 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e 74  ffset to content
269b0 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 69   of first cell i
269c0 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20 61  n parent */..  a
269d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50  ssert( pPage->pP
269e0 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73  arent==0 );.  as
269f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
26a00 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70 42  erflow>0 );.  pB
26a10 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
26a20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
26a30 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
26a40 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c  Child, &pgnoChil
26a50 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  d, pPage->pgno, 
26a60 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  0);.  if( rc ) r
26a70 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73 65  eturn rc;.  asse
26a80 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
26a90 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69  Iswriteable(pChi
26aa0 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ld->pDbPage) );.
26ab0 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
26ac0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
26ad0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
26ae0 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
26af0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
26b00 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79 74  .  brk = get2byt
26b10 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
26b20 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69 6c  .  cdata = pChil
26b30 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63  d->aData;.  memc
26b40 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61 5b  py(cdata, &data[
26b50 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c  hdr], pPage->cel
26b60 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d  lOffset+2*pPage-
26b70 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d  >nCell-hdr);.  m
26b80 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72 6b  emcpy(&cdata[brk
26b90 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75  ], &data[brk], u
26ba0 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a  sableSize-brk);.
26bb0 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
26bc0 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20  ->isInit==0 );. 
26bd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
26be0 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
26bf0 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28  d, pPage);.  if(
26c00 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
26c10 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20  cedeeper_out;.  
26c20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
26c30 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76  Ovfl, pPage->aOv
26c40 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  fl, pPage->nOver
26c50 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67  flow*sizeof(pPag
26c60 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  e->aOvfl[0]));. 
26c70 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
26c80 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ow = pPage->nOve
26c90 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68  rflow;.  if( pCh
26ca0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ild->nOverflow )
26cb0 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46  {.    pChild->nF
26cc0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ree = 0;.  }.  a
26cd0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
26ce0 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  Cell==pPage->nCe
26cf0 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  ll );.  zeroPage
26d00 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
26d10 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
26d20 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
26d30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
26d40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
26d50 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
26d60 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
26d70 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
26d80 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61   into %d\n", pPa
26d90 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ge->pgno, pChild
26da0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65  ->pgno));.#ifnde
26db0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
26dc0 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
26dd0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
26de0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
26df0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
26e00 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  pBt, pChild->pgn
26e10 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
26e20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
26e30 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
26e40 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f   balancedeeper_o
26e50 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ut;.    for(i=0;
26e60 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
26e70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
26e80 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
26e90 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20  (pChild, i);.   
26ea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26eb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
26ec0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
26ed0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
26ee0 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e  dif.  rc = balan
26ef0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c  ce_nonroot(pChil
26f00 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70  d);..balancedeep
26f10 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  er_out:.  releas
26f20 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
26f30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26f40 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20 74  *.** Decide if t
26f50 68 65 20 70 61 67 65 20 70 50 61 67 65 20 6e 65  he page pPage ne
26f60 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63  eds to be balanc
26f70 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69 6e  ed.  If balancin
26f80 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65 64  g is.** required
26f90 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72 6f  , call the appro
26fa0 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
26fb0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
26fc0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
26fd0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
26fe0 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20 69  int insert){.  i
26ff0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27000 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  K;.  if( pPage->
27010 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  pParent==0 ){.  
27020 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
27030 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
27040 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
27050 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20 20  eeper(pPage);.  
27060 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
27070 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
27080 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
27090 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
270a0 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50 61  ce_shallower(pPa
270b0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ge);.    }.  }el
270c0 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
270d0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
270e0 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e 73  | .        (!ins
270f0 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46  ert && pPage->nF
27100 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ree>pPage->pBt->
27110 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20  usableSize*2/3) 
27120 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61  ){.      rc = ba
27130 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50  lance_nonroot(pP
27140 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
27150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27160 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
27170 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
27180 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
27190 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
271a0 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
271b0 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77   those cursors w
271c0 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
271d0 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64  wrFlag==0 in a d
271e0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61  ifferent.** data
271f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
27200 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  (a database conn
27210 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72  ection that shar
27220 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  es the pager.** 
27230 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63  cache with the c
27240 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  urrent connectio
27250 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65  n) and that othe
27260 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  r connection .**
27270 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52   is not in the R
27280 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20  eadUncommmitted 
27290 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
272a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
272b0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   .** SQLITE_LOCK
272c0 45 44 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 64 64  ED..**.** In add
272d0 69 74 69 6f 6e 20 74 6f 20 63 68 65 63 6b 69 6e  ition to checkin
272e0 67 20 66 6f 72 20 72 65 61 64 2d 6c 6f 63 6b 73  g for read-locks
272f0 20 28 77 68 65 72 65 20 61 20 72 65 61 64 2d 6c   (where a read-l
27300 6f 63 6b 20 0a 2a 2a 20 6d 65 61 6e 73 20 61 20  ock .** means a 
27310 63 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 77 69  cursor opened wi
27320 74 68 20 77 72 46 6c 61 67 3d 3d 30 29 20 74 68  th wrFlag==0) th
27330 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
27340 6d 6f 76 65 73 0a 2a 2a 20 61 6c 6c 20 77 72 69  moves.** all wri
27350 74 65 20 63 75 72 73 6f 72 73 20 73 6f 20 74 68  te cursors so th
27360 61 74 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  at they are poin
27370 74 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20  ting to the .** 
27380 66 69 72 73 74 20 43 65 6c 6c 20 6f 6e 20 74 68  first Cell on th
27390 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68  e root page.  Th
273a0 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
273b0 62 65 63 61 75 73 65 20 61 6e 20 69 6e 73 65 72  because an inser
273c0 74 20 0a 2a 2a 20 6f 72 20 64 65 6c 65 74 65 20  t .** or delete 
273d0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 65  might change the
273e0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
273f0 20 6f 6e 20 61 20 70 61 67 65 20 6f 72 20 64 65   on a page or de
27400 6c 65 74 65 0a 2a 2a 20 61 20 70 61 67 65 20 65  lete.** a page e
27410 6e 74 69 72 65 6c 79 20 61 6e 64 20 77 65 20 64  ntirely and we d
27420 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 6c 65  o not want to le
27430 61 76 65 20 61 6e 79 20 63 75 72 73 6f 72 73 20  ave any cursors 
27440 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
27450 6e 6f 6e 2d 65 78 69 73 74 61 6e 74 20 70 61 67  non-existant pag
27460 65 73 20 6f 72 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  es or cells..*/.
27470 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
27480 52 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 20  ReadLocks(Btree 
27490 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 70 67  *pBtree, Pgno pg
274a0 6e 6f 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72  noRoot, BtCursor
274b0 20 2a 70 45 78 63 6c 75 64 65 29 7b 0a 20 20 42   *pExclude){.  B
274c0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74  tCursor *p;.  Bt
274d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42  Shared *pBt = pB
274e0 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c  tree->pBt;.  sql
274f0 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65  ite3 *db = pBtre
27500 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 66 6f  e->pSqlite;.  fo
27510 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
27520 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
27530 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78  {.    if( p==pEx
27540 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65  clude ) continue
27550 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74  ;.    if( p->eSt
27560 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
27570 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  D ) continue;.  
27580 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
27590 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f  t!=pgnoRoot ) co
275a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
275b0 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 29 7b 0a  p->wrFlag==0 ){.
275c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
275d0 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72  bOther = p->pBtr
275e0 65 65 2d 3e 70 53 71 6c 69 74 65 3b 0a 20 20 20  ee->pSqlite;.   
275f0 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d     if( dbOther==
27600 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64  0 ||.         (d
27610 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64  bOther!=db && (d
27620 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20  bOther->flags & 
27630 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
27640 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20  mitted)==0) ){. 
27650 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
27660 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
27670 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
27680 66 28 20 70 2d 3e 70 50 61 67 65 2d 3e 70 67 6e  f( p->pPage->pgn
27690 6f 21 3d 70 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  o!=p->pgnoRoot )
276a0 7b 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 52 6f  {.      moveToRo
276b0 6f 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ot(p);.    }.  }
276c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
276d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
276e0 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
276f0 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65  d into the BTree
27700 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69  .  The key is gi
27710 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65  ven by (pKey,nKe
27720 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  y).** and the da
27730 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ta is given by (
27740 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54  pData,nData).  T
27750 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
27760 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66  d only to.** def
27770 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74  ine what table t
27780 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  he record should
27790 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
277a0 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
277b0 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
277c0 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c  ng at a random l
277d0 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ocation..**.** F
277e0 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62  or an INTKEY tab
277f0 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  le, only the nKe
27800 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b  y value of the k
27810 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65  ey is used.  pKe
27820 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  y is.** ignored.
27830 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41    For a ZERODATA
27840 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74   table, the pDat
27850 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20  a and nData are 
27860 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f  both ignored..*/
27870 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27880 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
27890 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
278a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
278b0 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
278c0 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
278d0 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
278e0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
278f0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
27900 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
27910 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
27920 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
27930 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
27940 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
27950 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
27960 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27980 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
27990 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
279a0 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
279b0 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20 20  int appendBias  
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
279d0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
279e0 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
279f0 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nd */.){.  int r
27a00 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20  c;.  int loc;.  
27a10 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d  int szNew;.  Mem
27a20 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42  Page *pPage;.  B
27a30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
27a40 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
27a50 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
27a60 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e  r *oldCell;.  un
27a70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77  signed char *new
27a80 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Cell = 0;..  if(
27a90 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
27aa0 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion!=TRANS_WRITE
27ab0 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
27ac0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
27ad0 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  ion before doing
27ae0 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   an insert */.  
27af0 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65    return pBt->re
27b00 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
27b10 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
27b20 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
27b30 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
27b40 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21  dOnly );.  if( !
27b50 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a  pCur->wrFlag ){.
27b60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27b70 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72  E_PERM;   /* Cur
27b80 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72  sor not open for
27b90 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a   writing */.  }.
27ba0 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
27bb0 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65  ocks(pCur->pBtre
27bc0 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCur->pgnoRoo
27bd0 74 2c 20 70 43 75 72 29 20 29 7b 0a 20 20 20 20  t, pCur) ){.    
27be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
27bf0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
27c00 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
27c10 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
27c20 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  k */.  }..  /* S
27c30 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
27c40 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
27c50 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
27c60 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  his table */.  c
27c70 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
27c80 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
27c90 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
27ca0 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
27cb0 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
27cc0 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
27cd0 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f   ||.    SQLITE_O
27ce0 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
27cf0 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
27d00 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70  , pKey, nKey, ap
27d10 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29  pendBias, &loc))
27d20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
27d30 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67   rc;.  }..  pPag
27d40 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
27d50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27d60 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79  ->intKey || nKey
27d70 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
27d80 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
27d90 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61  !pPage->leafData
27da0 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e   );.  TRACE(("IN
27db0 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e  SERT: table=%d n
27dc0 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25  key=%lld ndata=%
27dd0 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c  d page=%d %s\n",
27de0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
27df0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c  >pgnoRoot, nKey,
27e00 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70   nData, pPage->p
27e10 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c  gno,.          l
27e20 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69  oc==0 ? "overwri
27e30 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79  te" : "new entry
27e40 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  "));.  assert( p
27e50 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
27e60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27e70 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
27e80 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
27e90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
27ea0 20 20 6e 65 77 43 65 6c 6c 20 3d 20 73 71 6c 69    newCell = sqli
27eb0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f  teMallocRaw( MX_
27ec0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
27ed0 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d  ;.  if( newCell=
27ee0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
27ef0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d  TE_NOMEM;.  rc =
27f00 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67   fillInCell(pPag
27f10 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79  e, newCell, pKey
27f20 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e  , nKey, pData, n
27f30 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a  Data, nZero, &sz
27f40 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29  New);.  if( rc )
27f50 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
27f60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
27f70 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  w==cellSizePtr(p
27f80 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29  Page, newCell) )
27f90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65  ;.  assert( szNe
27fa0 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  w<=MX_CELL_SIZE(
27fb0 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f  pBt) );.  if( lo
27fc0 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56  c==0 && CURSOR_V
27fd0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
27fe0 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  te ){.    int sz
27ff0 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Old;.    assert(
28000 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
28010 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
28020 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 6f  ->nCell );.    o
28030 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  ldCell = findCel
28040 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
28050 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
28060 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
28070 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
28080 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
28090 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
280a0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
280b0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
280c0 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
280d0 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
280e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
280f0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
28100 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50  .    dropCell(pP
28110 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
28120 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20  szOld);.  }else 
28130 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61  if( loc<0 && pPa
28140 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ge->nCell>0 ){. 
28150 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28160 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43  ->leaf );.    pC
28170 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70  ur->idx++;.    p
28180 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
28190 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
281a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
281b0 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72  >leaf );.  }.  r
281c0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
281d0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
281e0 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c   newCell, szNew,
281f0 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
28200 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
28210 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
28220 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
28230 61 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71  age, 1);.  /* sq
28240 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75  lite3BtreePageDu
28250 6d 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43  mp(pCur->pBt, pC
28260 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ur->pgnoRoot, 1)
28270 3b 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68  ; */.  /* fflush
28280 28 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69  (stdout); */.  i
28290 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
282a0 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
282b0 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e  ot(pCur);.  }.en
282c0 64 5f 69 6e 73 65 72 74 3a 0a 20 20 73 71 6c 69  d_insert:.  sqli
282d0 74 65 46 72 65 65 28 6e 65 77 43 65 6c 6c 29 3b  teFree(newCell);
282e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
282f0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
28300 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
28310 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
28320 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72  ing to.  The cur
28330 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
28340 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
28350 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  dom location..*/
28360 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28370 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
28380 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
28390 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
283a0 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67  ->pPage;.  unsig
283b0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
283c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
283d0 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b  o pgnoChild = 0;
283e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
283f0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d   = pCur->pBtree-
28400 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
28410 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
28420 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
28430 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e  ransaction!=TRAN
28440 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f  S_WRITE ){.    /
28450 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74  * Must start a t
28460 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72  ransaction befor
28470 65 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65  e doing a delete
28480 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
28490 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
284a0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
284b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
284c0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42   }.  assert( !pB
284d0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
284e0 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e   if( pCur->idx >
284f0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  = pPage->nCell )
28500 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
28510 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54  ITE_ERROR;  /* T
28520 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
28530 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79   pointing to any
28540 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
28550 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67  f( !pCur->wrFlag
28560 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28570 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a  QLITE_PERM;   /*
28580 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68   Did not open th
28590 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72  is cursor for wr
285a0 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  iting */.  }.  i
285b0 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
285c0 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20  s(pCur->pBtree, 
285d0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
285e0 70 43 75 72 29 20 29 7b 0a 20 20 20 20 72 65 74  pCur) ){.    ret
285f0 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
28600 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  D; /* The table 
28610 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
28620 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
28630 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  /.  }..  /* Rest
28640 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
28650 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
28660 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20  (a no-op if the 
28670 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  cursor is not in
28680 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45   .  ** CURSOR_RE
28690 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29  QUIRESEEK state)
286a0 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f   and save the po
286b0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
286c0 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20  ther cursors .  
286d0 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  ** open on the s
286e0 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20  ame table. Then 
286f0 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
28700 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20  rWrite() on the 
28710 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  page.  ** that t
28720 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  he entry will be
28730 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20   deleted from.. 
28740 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
28750 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
28760 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
28770 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20  n(pCur))!=0 ||. 
28780 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c 6c     (rc = saveAll
28790 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
287a0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
287b0 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72  r))!=0 ||.    (r
287c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
287d0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
287e0 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a 20  Page))!=0.  ){. 
287f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28800 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
28810 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 69  he cell within i
28820 74 27 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61  t's page and lea
28830 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e  ve pCell pointin
28840 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  g to the.  ** da
28850 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c  ta. The clearCel
28860 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61  l() call frees a
28870 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
28880 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28890 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  h the.  ** cell.
288a0 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66   The cell itself
288b0 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74   is still intact
288c0 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d  ..  */.  pCell =
288d0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
288e0 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69   pCur->idx);.  i
288f0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
28900 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64  ){.    pgnoChild
28910 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
28920 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  l);.  }.  rc = c
28930 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
28940 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63  pCell);.  if( rc
28950 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
28960 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
28970 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  f ){.    /*.    
28980 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20  ** The entry we 
28990 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c  are about to del
289a0 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  ete is not a lea
289b0 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f  f so if we do no
289c0 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65  t.    ** do some
289d0 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65  thing we will le
289e0 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e  ave a hole on an
289f0 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a   internal page..
28a00 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74      ** We have t
28a10 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20  o fill the hole 
28a20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63  by moving in a c
28a30 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e  ell from a leaf.
28a40 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78    The.    ** nex
28a50 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65  t Cell after the
28a60 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74   one to be delet
28a70 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ed is guaranteed
28a80 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20   to exist and.  
28a90 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61    ** to be a lea
28aa0 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20  f so we can use 
28ab0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42  it..    */.    B
28ac0 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b  tCursor leafCur;
28ad0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
28ae0 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69  ar *pNext;.    i
28af0 6e 74 20 73 7a 4e 65 78 74 3b 20 20 2f 2a 20 54  nt szNext;  /* T
28b00 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  he compiler warn
28b10 69 6e 67 20 69 73 20 77 72 6f 6e 67 3a 20 73 7a  ing is wrong: sz
28b20 4e 65 78 74 20 69 73 20 61 6c 77 61 79 73 20 0a  Next is always .
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
28b50 62 65 66 6f 72 65 20 75 73 65 2e 20 20 41 64 64  before use.  Add
28b60 69 6e 67 20 61 6e 20 65 78 74 72 61 20 69 6e 69  ing an extra ini
28b70 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20  tialization.    
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
28b90 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 65 20 63  to silence the c
28ba0 6f 6d 70 69 6c 65 72 20 73 6c 6f 77 73 20 64 6f  ompiler slows do
28bb0 77 6e 20 74 68 65 20 63 6f 64 65 2e 20 2a 2f 0a  wn the code. */.
28bc0 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b      int notUsed;
28bd0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
28be0 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20 3d 20 30  ar *tempCell = 0
28bf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
28c00 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 29  Page->leafData )
28c10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
28c20 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
28c30 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29 3b  pCur, &leafCur);
28c40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
28c50 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61 66  3BtreeNext(&leaf
28c60 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  Cur, &notUsed);.
28c70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
28c90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28ca0 57 72 69 74 65 28 6c 65 61 66 43 75 72 2e 70 50  Write(leafCur.pP
28cb0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
28cc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
28cd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28ce0 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45      TRACE(("DELE
28cf0 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c  TE: table=%d del
28d00 65 74 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f  ete internal fro
28d10 6d 20 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f  m %d replace fro
28d20 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20  m leaf %d\n",.  
28d30 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
28d40 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67  oRoot, pPage->pg
28d50 6e 6f 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67  no, leafCur.pPag
28d60 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  e->pgno));.     
28d70 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
28d80 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c   pCur->idx, cell
28d90 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
28da0 43 65 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e  Cell));.      pN
28db0 65 78 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c  ext = findCell(l
28dc0 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65  eafCur.pPage, le
28dd0 61 66 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20  afCur.idx);.    
28de0 20 20 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53    szNext = cellS
28df0 69 7a 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70  izePtr(leafCur.p
28e00 50 61 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20  Page, pNext);.  
28e10 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43      assert( MX_C
28e20 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73  ELL_SIZE(pBt)>=s
28e30 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20  zNext+4 );.     
28e40 20 74 65 6d 70 43 65 6c 6c 20 3d 20 73 71 6c 69   tempCell = sqli
28e50 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 4d 58 5f  teMallocRaw( MX_
28e60 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
28e70 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70  ;.      if( temp
28e80 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
28e90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
28ea0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
28eb0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
28ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28ed0 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65     rc = insertCe
28ee0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
28ef0 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73 7a  idx, pNext-4, sz
28f00 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c 6c  Next+4, tempCell
28f10 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
28f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28f30 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  K ){.      put4b
28f40 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
28f50 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
28f60 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c  ->idx), pgnoChil
28f70 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62  d);.      rc = b
28f80 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29  alance(pPage, 0)
28f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28fa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28fb0 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
28fc0 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c  leafCur.pPage, l
28fd0 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65  eafCur.idx, szNe
28fe0 78 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xt);.      rc = 
28ff0 62 61 6c 61 6e 63 65 28 6c 65 61 66 43 75 72 2e  balance(leafCur.
29000 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pPage, 0);.    }
29010 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
29020 74 65 6d 70 43 65 6c 6c 29 3b 0a 20 20 20 20 73  tempCell);.    s
29030 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61  qlite3BtreeRelea
29040 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65  seTempCursor(&le
29050 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  afCur);.  }else{
29060 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c  .    TRACE(("DEL
29070 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65  ETE: table=%d de
29080 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lete from leaf %
29090 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75  d\n",.       pCu
290a0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
290b0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
290c0 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
290d0 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53  pCur->idx, cellS
290e0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
290f0 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell));.    rc = 
29100 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30  balance(pPage, 0
29110 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
29120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29130 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
29140 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
29150 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
29160 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
29170 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
29180 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
29190 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
291a0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
291b0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
291c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79  le..**.** The ty
291d0 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65  pe of type is de
291e0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
291f0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  flags parameter.
29200 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f    Only the.** fo
29210 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f  llowing values o
29220 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72  f flags are curr
29230 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f  ently in use.  O
29240 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a  ther values for.
29250 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e  ** flags might n
29260 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20  ot work:.**.**  
29270 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c     BTREE_INTKEY|
29280 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20  BTREE_LEAFDATA  
29290 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
292a0 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69  tables with rowi
292b0 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54  d keys.**     BT
292c0 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20  REE_ZERODATA    
292d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
292e0 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63  ed for SQL indic
292f0 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  es.*/.int sqlite
29300 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
29310 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
29320 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
29330 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ags){.  BtShared
29340 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
29350 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
29360 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
29370 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  t;.  int rc;.  i
29380 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
29390 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
293a0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
293b0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
293c0 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20  ction first */. 
293d0 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
293e0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
293f0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
29400 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
29410 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
29420 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65  adOnly );..#ifde
29430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
29440 54 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20  TOVACUUM.  rc = 
29450 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
29460 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
29470 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
29480 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
29490 72 6e 20 72 63 3b 0a 23 65 6c 73 65 0a 20 20 69  rn rc;.#else.  i
294a0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
294b0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
294c0 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a  gnoMove;      /*
294d0 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72   Move a page her
294e0 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  e to make room f
294f0 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
29500 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
29510 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54  *pPageMove; /* T
29520 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  he page to move 
29530 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  to. */..    /* C
29540 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  reating a new ta
29550 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79  ble may probably
29560 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
29570 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  an existing data
29580 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  base.    ** to m
29590 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
295a0 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74   new tables root
295b0 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74   page. In case t
295c0 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20  his page turns. 
295d0 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20     ** out to be 
295e0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
295f0 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65  , delete all ove
29600 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63  rflow page-map c
29610 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c  aches.    ** hel
29620 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72  d by open cursor
29630 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  s..    */.    in
29640 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
29650 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a  lowCache(pBt);..
29660 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
29670 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d  value of meta[3]
29680 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
29690 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  se to determine 
296a0 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  where the.    **
296b0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
296c0 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75  e new table shou
296d0 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69  ld go. meta[3] i
296e0 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  s the largest ro
296f0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63  ot-page.    ** c
29700 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73  reated so far, s
29710 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  o the new root-p
29720 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b  age is (meta[3]+
29730 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  1)..    */.    r
29740 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
29750 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70  GetMeta(p, 4, &p
29760 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
29770 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29780 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29790 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20   pgnoRoot++;..  
297a0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f    /* The new roo
297b0 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  t-page may not b
297c0 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61  e allocated on a
297d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
297e0 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e, or the.    **
297f0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61   PENDING_BYTE pa
29800 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
29810 66 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52  f( pgnoRoot==PTR
29820 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
29830 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20  pgnoRoot) ||.   
29840 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50       pgnoRoot==P
29850 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
29860 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70  (pBt) ){.      p
29870 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d  gnoRoot++;.    }
29880 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
29890 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20  oRoot>=3 );..   
298a0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70   /* Allocate a p
298b0 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68  age. The page th
298c0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73  at currently res
298d0 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ides at pgnoRoot
298e0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
298f0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c  moved to the all
29900 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c  ocated page (unl
29910 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  ess the allocate
29920 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20  d page happens. 
29930 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20     ** to reside 
29940 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20  at pgnoRoot)..  
29950 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c    */.    rc = al
29960 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
29970 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c  pBt, &pPageMove,
29980 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f   &pgnoMove, pgno
29990 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66  Root, 1);.    if
299a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
299b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
299c0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
299d0 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e  f( pgnoMove!=pgn
299e0 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f  oRoot ){.      /
299f0 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  * pgnoRoot is th
29a00 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  e page that will
29a10 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
29a20 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20   root-page of.  
29a30 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74      ** the new t
29a40 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61  able (assuming a
29a50 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20  n error did not 
29a60 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77  occur). But we w
29a70 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  ere.      ** all
29a80 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e  ocated pgnoMove.
29a90 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e   If required (i.
29aa0 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  e. if it was not
29ab0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
29ac0 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67   ** by extending
29ad0 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20   the file), the 
29ae0 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20  current page at 
29af0 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76  position pgnoMov
29b00 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
29b10 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e  ready journaled.
29b20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
29b30 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
29b40 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
29b50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
29b60 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20  e(pPageMove);.. 
29b70 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65       /* Move the
29b80 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
29b90 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70  at pgnoRoot to p
29ba0 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  gnoMove. */.    
29bb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
29bc0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29bd0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
29be0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
29bf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29c00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29c10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
29c20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
29c30 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
29c40 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
29c50 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
29c60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65  !=SQLITE_OK || e
29c70 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
29c80 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d  TPAGE || eType==
29c90 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
29ca0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
29cb0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
29cc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29ce0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
29cf0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
29d00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29d10 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
29d20 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
29d30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29d40 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
29d50 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
29d60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29d70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
29d80 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
29d90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
29da0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29db0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
29dc0 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
29dd0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
29de0 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  gnoMove);.      
29df0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
29e00 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62  t);..      /* Ob
29e10 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74  tain the page at
29e20 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20   pgnoRoot */.   
29e30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29e40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29e50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29e60 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
29e70 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
29e80 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
29e90 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
29ea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29eb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29ec0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29ed0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
29ee0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29ef0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
29f00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
29f10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29f20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
29f30 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
29f40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29f50 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
29f60 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67      pRoot = pPag
29f70 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20  eMove;.    } .. 
29f80 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
29f90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64   pointer-map and
29fa0 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20   meta-data with 
29fb0 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
29fc0 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  e number. */.   
29fd0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
29fe0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50  pBt, pgnoRoot, P
29ff0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
2a000 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
2a010 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2a020 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2a030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2a040 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
2a050 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
2a060 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f  ta(p, 4, pgnoRoo
2a070 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
2a080 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2a090 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2a0a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2a0b0 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
2a0c0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2a0d0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52  reePage(pBt, &pR
2a0e0 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20  oot, &pgnoRoot, 
2a0f0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
2a100 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2a110 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65   }.#endif.  asse
2a120 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2a130 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
2a140 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2a150 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c   zeroPage(pRoot,
2a160 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41   flags | PTF_LEA
2a170 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  F);.  sqlite3Pag
2a180 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70  erUnref(pRoot->p
2a190 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61  DbPage);.  *piTa
2a1a0 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52  ble = (int)pgnoR
2a1b0 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oot;.  return SQ
2a1c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2a1d0 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65  * Erase the give
2a1e0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
2a1f0 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c  and all its chil
2a200 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  dren.  Return.**
2a210 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
2a220 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74   freelist..*/.st
2a230 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61  atic int clearDa
2a240 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74  tabasePage(.  Bt
2a250 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2a260 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
2a270 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ree that contain
2a280 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  s the table */. 
2a290 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
2a2a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2a2b0 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a  umber to clear *
2a2c0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2a2d0 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50 61 72  rent,     /* Par
2a2e0 65 6e 74 20 70 61 67 65 2e 20 20 4e 55 4c 4c 20  ent page.  NULL 
2a2f0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 2a 2f 0a  for the root */.
2a300 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c    int freePageFl
2a310 61 67 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c  ag      /* Deall
2a320 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74 72  ocate page if tr
2a330 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ue */.){.  MemPa
2a340 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
2a350 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
2a360 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2a370 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
2a380 20 70 67 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67   pgno>sqlite3Pag
2a390 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
2a3a0 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
2a3b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2a3c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2a3d0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
2a3e0 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
2a3f0 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e  , &pPage, pParen
2a400 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  t);.  if( rc ) g
2a410 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2a420 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72  epage_out;.  for
2a430 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
2a440 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2a450 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2a460 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2a470 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2a480 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
2a490 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2a4a0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
2a4b0 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50  Cell), pPage->pP
2a4c0 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20  arent, 1);.     
2a4d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2a4e0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2a4f0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2a500 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
2a510 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2a520 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2a530 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2a540 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
2a550 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2a560 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
2a570 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2a580 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2a590 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61  ->aData[8]), pPa
2a5a0 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b  ge->pParent, 1);
2a5b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2a5c0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2a5d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2a5e0 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67  if( freePageFlag
2a5f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
2a600 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2a610 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
2a620 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a630 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2a640 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72  ))==0 ){.    zer
2a650 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  oPage(pPage, pPa
2a660 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50  ge->aData[0] | P
2a670 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63  TF_LEAF);.  }..c
2a680 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2a690 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
2a6a0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
2a6b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a6c0 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66  * Delete all inf
2a6d0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
2a6e0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
2a6f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69  the database.  i
2a700 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20  Table is.** the 
2a710 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2a720 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2a730 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69  able.  After thi
2a740 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2a750 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s,.** the root p
2a760 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75  age is empty, bu
2a770 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a  t still exists..
2a780 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2a790 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
2a7a0 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
2a7b0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
2a7c0 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75   open.** read cu
2a7d0 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
2a7e0 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20  le.  Open write 
2a7f0 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65  cursors are move
2a800 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  d to the.** root
2a810 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2a820 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2a830 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72  eeClearTable(Btr
2a840 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2a850 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
2a860 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2a870 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 2d  p->pBt;.  if( p-
2a880 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
2a890 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74  WRITE ){.    ret
2a8a0 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  urn pBt->readOnl
2a8b0 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2a8c0 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2a8d0 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  OR;.  }.  rc = c
2a8e0 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
2a8f0 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 69   iTable, 0);.  i
2a900 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2a910 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2a920 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
2a930 69 6f 6e 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f  ion of all curso
2a940 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20  rs open on this 
2a950 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 53  table */.  if( S
2a960 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2a970 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2a980 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20  Bt, iTable, 0)) 
2a990 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2a9a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2a9b0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2a9c0 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
2a9d0 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  ble, 0, 0);.}../
2a9e0 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
2a9f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20  nformation in a 
2aa00 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68  table and add th
2aa10 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
2aa20 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72  ble to.** the fr
2aa30 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c  eelist.  Except,
2aa40 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
2aa50 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65   principle table
2aa60 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20   (the one on.** 
2aa70 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72  page 1) is never
2aa80 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
2aa90 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  eelist..**.** Th
2aaa0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2aab0 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
2aac0 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
2aad0 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
2aae0 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
2aaf0 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
2ab00 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
2ab10 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61  abled and the pa
2ab20 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20  ge at iTable is 
2ab30 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  not the last.** 
2ab40 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
2ab50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2ab60 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f  then the last ro
2ab70 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20 74  ot page .** in t
2ab80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ab90 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20 74   is moved into t
2aba0 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79  he slot formerly
2abb0 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a 20   occupied by.** 
2abc0 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74 20  iTable and that 
2abd0 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65 72  last slot former
2abe0 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20 74  ly occupied by t
2abf0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
2ac00 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  e.** is added to
2ac10 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
2ac20 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65 2e  stead of iTable.
2ac30 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20 61    In this say, a
2ac40 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 73  ll.** root pages
2ac50 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68 65   are kept at the
2ac60 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2ac70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2ac80 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65 63   which.** is nec
2ac90 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f 56  essary for AUTOV
2aca0 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72 69  ACUUM to work ri
2acb0 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20 69  ght.  *piMoved i
2acc0 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a  s set to the .**
2acd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
2ace0 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65  t used to be the
2acf0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
2ad00 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f  in the file befo
2ad10 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e 20  re.** the move. 
2ad20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74 73   If no page gets
2ad30 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65 64   moved, *piMoved
2ad40 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a   is set to 0..**
2ad50 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   The last root p
2ad60 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64 20  age is recorded 
2ad70 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20 74  in meta[3] and t
2ad80 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d  he value of.** m
2ad90 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74 65  eta[3] is update
2ada0 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 64  d by this proced
2adb0 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ure..*/.int sqli
2adc0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
2add0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
2ade0 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d  iTable, int *piM
2adf0 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
2ae00 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2ae10 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  e = 0;.  BtShare
2ae20 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2ae30 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
2ae40 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
2ae50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
2ae60 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2ae70 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2ae80 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2ae90 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  }..  /* It is il
2aea0 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20  legal to drop a 
2aeb0 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72  table if any cur
2aec0 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e  sors are open on
2aed0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
2aee0 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  se. This is beca
2aef0 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  use in auto-vacu
2af00 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b  um mode the back
2af10 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65  end may.  ** nee
2af20 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65  d to move anothe
2af30 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66  r root-page to f
2af40 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62  ill a gap left b
2af50 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20  y the deleted.  
2af60 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66  ** root page. If
2af70 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
2af80 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70  was using this p
2af90 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f  age a problem wo
2afa0 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e  uld .  ** occur.
2afb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2afc0 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
2afd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2afe0 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  CKED;.  }..  rc 
2aff0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2b000 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
2b010 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c  )iTable, &pPage,
2b020 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
2b030 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
2b040 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
2b050 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62  earTable(p, iTab
2b060 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  le);.  if( rc ){
2b070 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2b080 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
2b090 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a  urn rc;.  }..  *
2b0a0 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  piMoved = 0;..  
2b0b0 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a  if( iTable>1 ){.
2b0c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2b0d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2b0e0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2b0f0 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  pPage);.    rele
2b100 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2b110 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42  #else.    if( pB
2b120 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2b130 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52  .      Pgno maxR
2b140 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72  ootPgno;.      r
2b150 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2b160 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d  GetMeta(p, 4, &m
2b170 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
2b180 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b1a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2b1b0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
2b1c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
2b1d0 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65        if( iTable
2b1e0 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b  ==maxRootPgno ){
2b1f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2b200 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
2b210 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61  ropped is the ta
2b220 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  ble with the lar
2b230 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2b240 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
2b250 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2b260 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70  , put the root p
2b270 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20  age on the free 
2b280 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
2b290 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
2b2a0 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
2b2b0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2b2c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2b2d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b2e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b2f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b300 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2b310 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2b320 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
2b330 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74  dropped does not
2b340 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73   have the larges
2b350 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
2b360 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
2b370 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53   the database. S
2b380 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  o move the page 
2b390 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74  that does into t
2b3a0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  he .        ** g
2b3b0 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
2b3c0 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65  eleted root-page
2b3d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2b3e0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d       MemPage *pM
2b3f0 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ove;.        rel
2b400 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2b410 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2b420 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2b430 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
2b440 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a  no, &pMove, 0);.
2b450 20 20 20 20 20 20 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 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2b480 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b490 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
2b4a0 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65  ePage(pBt, pMove
2b4b0 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
2b4c0 45 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20  E, 0, iTable);. 
2b4d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2b4e0 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
2b4f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b510 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2b520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2b530 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2b540 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  GetPage(pBt, max
2b550 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
2b560 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2b570 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2b590 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2b5a0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  }.        rc = f
2b5b0 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  reePage(pMove);.
2b5c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2b5d0 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
2b5e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b5f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b600 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b620 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f  *piMoved = maxRo
2b630 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  otPgno;.      }.
2b640 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
2b650 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d  e new 'max-root-
2b660 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74  page' value in t
2b670 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
2b680 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  er. This.      *
2b690 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c  * is the old val
2b6a0 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73  ue less one, les
2b6b0 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68  s one more if th
2b6c0 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20  at happens to.  
2b6d0 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74      ** be a root
2b6e0 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65  -page number, le
2b6f0 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20  ss one again if 
2b700 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20 20  that is the.    
2b710 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
2b720 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f  E_PAGE..      */
2b730 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67  .      maxRootPg
2b740 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  no--;.      if( 
2b750 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e  maxRootPgno==PEN
2b760 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2b770 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  Bt) ){.        m
2b780 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
2b790 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2b7a0 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52  maxRootPgno==PTR
2b7b0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
2b7c0 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a  maxRootPgno) ){.
2b7d0 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50          maxRootP
2b7e0 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  gno--;.      }. 
2b7f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 78       assert( max
2b800 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  RootPgno!=PENDIN
2b810 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2b820 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   );..      rc = 
2b830 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
2b840 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78  teMeta(p, 4, max
2b850 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  RootPgno);.    }
2b860 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2b870 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
2b880 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
2b890 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2b8a0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
2b8b0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69  {.    /* If sqli
2b8c0 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
2b8d0 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20  e was called on 
2b8e0 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a  page 1. */.    z
2b8f0 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50  eroPage(pPage, P
2b900 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
2b910 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  AF );.    releas
2b920 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2b930 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  }.  return rc;  
2b940 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
2b950 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  the meta-informa
2b960 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64 61  tion out of a da
2b970 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d 65  tabase file.  Me
2b980 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65 20  ta[0].** is the 
2b990 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70  number of free p
2b9a0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
2b9b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2b9c0 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f   Meta[1].** thro
2b9d0 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72 65  ugh meta[15] are
2b9e0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
2b9f0 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61 79  se by higher lay
2ba00 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a  ers.  Meta[0].**
2ba10 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 74   is read-only, t
2ba20 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72 65  he others are re
2ba30 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a  ad/write..** .**
2ba40 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79 65   The schema laye
2ba50 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20 76  r numbers meta v
2ba60 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74 6c  alues differentl
2ba70 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65 6d  y.  At the schem
2ba80 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64 20  a.** layer (and 
2ba90 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61 6e  the SetCookie an
2baa0 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70 63  d ReadCookie opc
2bab0 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65 72  odes) the number
2bac0 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67 65   of.** free page
2bad0 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c 65  s is not visible
2bae0 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20  .  So Cookie[0] 
2baf0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 4d  is the same as M
2bb00 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73  eta[1]..*/.int s
2bb10 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2bb20 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
2bb30 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74 61   idx, u32 *pMeta
2bb40 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
2bb50 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
2bb60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2bb70 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65 64  *pP1;.  BtShared
2bb80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2bb90 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61 20  .  /* Reading a 
2bba0 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65 20  meta-data value 
2bbb0 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  requires a read-
2bbc0 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 28  lock on page 1 (
2bbd0 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74  and hence.  ** t
2bbe0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
2bbf0 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62 20   table. We grab 
2bc00 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72 64  this lock regard
2bc10 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2bc20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  or.  ** not the 
2bc30 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2bc40 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
2bc50 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72 6f  et (the table ro
2bc60 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20 2a  oted at page.  *
2bc70 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20 61  * 1 is treated a
2bc80 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
2bc90 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c 6f   by queryTableLo
2bca0 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62  ck() and lockTab
2bcb0 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63  le())..  */.  rc
2bcc0 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63   = queryTableLoc
2bcd0 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43  k(p, 1, READ_LOC
2bce0 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
2bcf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
2bd00 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2bd10 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
2bd20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
2bd30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2bd40 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
2bd50 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , 1, &pDbPage);.
2bd60 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2bd70 6e 20 72 63 3b 0a 20 20 70 50 31 20 3d 20 28 75  n rc;.  pP1 = (u
2bd80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73  nsigned char *)s
2bd90 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
2bda0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a  ta(pDbPage);.  *
2bdb0 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65  pMeta = get4byte
2bdc0 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34  (&pP1[36 + idx*4
2bdd0 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  ]);.  sqlite3Pag
2bde0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
2bdf0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76  ;..  /* If autov
2be00 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62  acuumed is disab
2be10 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  led in this buil
2be20 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79  d but we are try
2be30 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63  ing to .  ** acc
2be40 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75  ess an autovacuu
2be50 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  med database, th
2be60 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61  en make the data
2be70 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a  base readonly. .
2be80 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
2be90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2bea0 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20  UM.  if( idx==4 
2beb0 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42  && *pMeta>0 ) pB
2bec0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
2bed0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72  .#endif..  /* Gr
2bee0 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  ab the read-lock
2bef0 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
2bf00 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28   rc = lockTable(
2bf10 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
2bf20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2bf30 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65  ../*.** Write me
2bf40 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62  ta-information b
2bf50 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
2bf60 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20  abase.  Meta[0] 
2bf70 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20  is.** read-only 
2bf80 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65 20 77  and may not be w
2bf90 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ritten..*/.int s
2bfa0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
2bfb0 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  eMeta(Btree *p, 
2bfc0 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69 4d 65  int idx, u32 iMe
2bfd0 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ta){.  BtShared 
2bfe0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2bff0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2c000 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pP1;.  int rc;. 
2c010 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 31 20   assert( idx>=1 
2c020 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20  && idx<=15 );.  
2c030 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
2c040 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2c050 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72     return pBt->r
2c060 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2c070 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2c080 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2c090 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
2c0a0 67 65 31 21 3d 30 20 29 3b 0a 20 20 70 50 31 20  ge1!=0 );.  pP1 
2c0b0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  = pBt->pPage1->a
2c0c0 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
2c0d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2c0e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
2c0f0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
2c100 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 75   return rc;.  pu
2c110 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b  t4byte(&pP1[36 +
2c120 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b   idx*4], iMeta);
2c130 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c140 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
2c150 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20 62 79  turn the flag by
2c160 74 65 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  te at the beginn
2c170 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67 65 20  ing of the page 
2c180 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a  that the cursor.
2c190 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
2c1a0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a  pointing to..*/.
2c1b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c1c0 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
2c1d0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
2c1e0 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43 55 52  : What about CUR
2c1f0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2c200 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c 79 20  state? Probably 
2c210 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a  need to call.  *
2c220 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  * restoreOrClear
2c230 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
2c240 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65   here..  */.  Me
2c250 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2c260 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 72 65  Cur->pPage;.  re
2c270 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61  turn pPage ? pPa
2c280 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2c290 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b  >hdrOffset] : 0;
2c2a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2c2b0 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f  n the pager asso
2c2c0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54  ciated with a BT
2c2d0 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ree.  This routi
2c2e0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  ne is used for.*
2c2f0 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
2c300 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2c310 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42  .Pager *sqlite3B
2c320 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20  treePager(Btree 
2c330 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
2c340 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a  >pBt->pPager;.}.
2c350 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c360 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
2c370 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  HECK./*.** Appen
2c380 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74  d a message to t
2c390 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2c3a0 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
2c3b0 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70  ic void checkApp
2c3c0 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72  endMsg(.  Integr
2c3d0 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20  ityCk *pCheck,. 
2c3e0 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20   char *zMsg1,.  
2c3f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2c400 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20  mat,.  ....){.  
2c410 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
2c420 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28  ar *zMsg2;.  if(
2c430 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20   !pCheck->mxErr 
2c440 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65  ) return;.  pChe
2c450 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70  ck->mxErr--;.  p
2c460 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Check->nErr++;. 
2c470 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2c480 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20  ormat);.  zMsg2 
2c490 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
2c4a0 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
2c4b0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2c4c0 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a  if( zMsg1==0 ) z
2c4d0 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28  Msg1 = "";.  if(
2c4e0 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
2c4f0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
2c500 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72  ld = pCheck->zEr
2c510 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b  rMsg;.    pCheck
2c520 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
2c530 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
2c540 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72  ing(&pCheck->zEr
2c550 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22  rMsg, zOld, "\n"
2c560 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20  , zMsg1, zMsg2, 
2c570 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73  (char*)0);.    s
2c580 71 6c 69 74 65 46 72 65 65 28 7a 4f 6c 64 29 3b  qliteFree(zOld);
2c590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
2c5a0 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
2c5b0 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c  pCheck->zErrMsg,
2c5c0 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28   zMsg1, zMsg2, (
2c5d0 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20  char*)0);.  }.  
2c5e0 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 73 67 32  sqliteFree(zMsg2
2c5f0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
2c600 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
2c610 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
2c620 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c630 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
2c640 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74  CK./*.** Add 1 t
2c650 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  o the reference 
2c660 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69  count for page i
2c670 50 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69  Page.  If this i
2c680 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
2c690 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2c6a0 20 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72   page, add an er
2c6b0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70  ror message to p
2c6c0 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Check->zErrMsg..
2c6d0 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
2c6e0 68 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d  here are 2 ore m
2c6f0 6f 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ore references t
2c700 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30  o the page and 0
2c710 20 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69   if.** if this i
2c720 73 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65  s the first refe
2c730 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
2c740 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68  e..**.** Also ch
2c750 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
2c760 65 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62  e number is in b
2c770 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ounds..*/.static
2c780 20 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e   int checkRef(In
2c790 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
2c7a0 6b 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68  k, int iPage, ch
2c7b0 61 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20  ar *zContext){. 
2c7c0 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20   if( iPage==0 ) 
2c7d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
2c7e0 69 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50  iPage>pCheck->nP
2c7f0 61 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29  age || iPage<0 )
2c800 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
2c810 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
2c820 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20  ntext, "invalid 
2c830 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c  page number %d",
2c840 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
2c850 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2c860 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69   pCheck->anRef[i
2c870 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20  Page]==1 ){.    
2c880 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
2c890 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
2c8a0 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20   "2nd reference 
2c8b0 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  to page %d", iPa
2c8c0 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
2c8d0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2c8e0 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b   (pCheck->anRef[
2c8f0 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a  iPage]++)>1;.}..
2c900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c910 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
2c920 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
2c930 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65  the entry in the
2c940 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72   pointer-map for
2c950 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70   page iChild map
2c960 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50  s to .** page iP
2c970 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74  arent, pointer t
2c980 79 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20  ype ptrType. If 
2c990 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65  not, append an e
2c9a0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
2c9b0 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74  to pCheck..*/.st
2c9c0 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
2c9d0 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69  trmap(.  Integri
2c9e0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20  tyCk *pCheck,   
2c9f0 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65  /* Integrity che
2ca00 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ck context */.  
2ca10 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
2ca20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20         /* Child 
2ca30 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
2ca40 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
2ca50 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
2ca60 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
2ca70 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  type */.  Pgno i
2ca80 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
2ca90 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
2caa0 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20  nter map parent 
2cab0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
2cac0 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20   char *zContext 
2cad0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2cae0 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28  xt description (
2caf0 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
2cb00 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  sg) */.){.  int 
2cb10 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70  rc;.  u8 ePtrmap
2cb20 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Type;.  Pgno iPt
2cb30 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72  rmapParent;..  r
2cb40 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43  c = ptrmapGet(pC
2cb50 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c  heck->pBt, iChil
2cb60 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c  d, &ePtrmapType,
2cb70 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29   &iPtrmapParent)
2cb80 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2cb90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65  TE_OK ){.    che
2cba0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
2cbb0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46  ck, zContext, "F
2cbc0 61 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74  ailed to read pt
2cbd0 72 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43  rmap key=%d", iC
2cbe0 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  hild);.    retur
2cbf0 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50  n;.  }..  if( eP
2cc00 74 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65  trmapType!=eType
2cc10 20 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e   || iPtrmapParen
2cc20 74 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20  t!=iParent ){.  
2cc30 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2cc40 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
2cc50 74 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70  t, .      "Bad p
2cc60 74 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79  tr map entry key
2cc70 3d 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64  =%d expected=(%d
2cc80 2c 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29  ,%d) got=(%d,%d)
2cc90 22 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64  ", .      iChild
2cca0 2c 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74  , eType, iParent
2ccb0 2c 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69  , ePtrmapType, i
2ccc0 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20  PtrmapParent);. 
2ccd0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
2cce0 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74  ** Check the int
2ccf0 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72  egrity of the fr
2cd00 65 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20  eelist or of an 
2cd10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
2cd20 73 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  st..** Verify th
2cd30 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
2cd40 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69   pages on the li
2cd50 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74  st is N..*/.stat
2cd60 69 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73  ic void checkLis
2cd70 74 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  t(.  IntegrityCk
2cd80 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e   *pCheck,  /* In
2cd90 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67  tegrity checking
2cda0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
2cdb0 74 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20  t isFreeList,   
2cdc0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2cdd0 61 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c  a freelist.  Fal
2cde0 73 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20  se for overflow 
2cdf0 70 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69  page list */.  i
2ce00 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
2ce10 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2ce20 62 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61  ber for first pa
2ce30 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  ge in the list *
2ce40 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
2ce50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
2ce60 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ected number of 
2ce70 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
2ce80 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t */.  char *zCo
2ce90 6e 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20  ntext        /* 
2cea0 43 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f  Context for erro
2ceb0 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b  r messages */.){
2cec0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2ced0 65 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20  expected = N;.  
2cee0 69 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61  int iFirst = iPa
2cef0 67 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ge;.  while( N--
2cf00 20 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e   > 0 && pCheck->
2cf10 6d 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50  mxErr ){.    DbP
2cf20 61 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a  age *pOvflPage;.
2cf30 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2cf40 72 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20  r *pOvflData;.  
2cf50 20 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b    if( iPage<1 ){
2cf60 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
2cf70 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
2cf80 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ontext,.        
2cf90 20 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73   "%d of %d pages
2cfa0 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76   missing from ov
2cfb0 65 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72  erflow list star
2cfc0 74 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20  ting at %d",.   
2cfd0 20 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65         N+1, expe
2cfe0 63 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20  cted, iFirst);. 
2cff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2d000 7d 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52  }.    if( checkR
2d010 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ef(pCheck, iPage
2d020 2c 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72  , zContext) ) br
2d030 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  eak;.    if( sql
2d040 69 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68  ite3PagerGet(pCh
2d050 65 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67  eck->pPager, (Pg
2d060 6e 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c  no)iPage, &pOvfl
2d070 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63  Page) ){.      c
2d080 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2d090 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
2d0a0 22 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70  "failed to get p
2d0b0 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
2d0c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2d0d0 20 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74    }.    pOvflDat
2d0e0 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
2d0f0 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
2d100 72 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61  rGetData(pOvflPa
2d110 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46  ge);.    if( isF
2d120 72 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  reeList ){.     
2d130 20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74   int n = get4byt
2d140 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29  e(&pOvflData[4])
2d150 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2d160 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2d170 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63  .      if( pChec
2d180 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  k->pBt->autoVacu
2d190 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  um ){.        ch
2d1a0 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
2d1b0 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
2d1c0 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f  FREEPAGE, 0, zCo
2d1d0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
2d1e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
2d1f0 20 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e   n>pCheck->pBt->
2d200 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29  usableSize/4-8 )
2d210 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
2d220 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
2d230 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
2d240 20 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20        "freelist 
2d250 6c 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62  leaf count too b
2d260 69 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20  ig on page %d", 
2d270 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
2d280 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  N--;.      }else
2d290 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
2d2a0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
2d2b0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
2d2c0 65 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  eePage = get4byt
2d2d0 65 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69  e(&pOvflData[8+i
2d2e0 2a 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  *4]);.#ifndef SQ
2d2f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2d300 43 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69  CUUM.          i
2d310 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e  f( pCheck->pBt->
2d320 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2d330 20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50            checkP
2d340 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46  trmap(pCheck, iF
2d350 72 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  reePage, PTRMAP_
2d360 46 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f  FREEPAGE, 0, zCo
2d370 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
2d380 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2d390 20 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43       checkRef(pC
2d3a0 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c  heck, iFreePage,
2d3b0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
2d3c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20      }.        N 
2d3d0 2d 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  -= n;.      }.  
2d3e0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
2d3f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2d400 55 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UM.    else{.   
2d410 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61     /* If this da
2d420 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
2d430 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20  auto-vacuum and 
2d440 69 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65  iPage is not the
2d450 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70   last.      ** p
2d460 61 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72  age in this over
2d470 66 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b  flow list, check
2d480 20 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65   that the pointe
2d490 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r-map entry for.
2d4a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c        ** the fol
2d4b0 6c 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63  lowing page matc
2d4c0 68 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20  hes iPage..     
2d4d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2d4e0 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  heck->pBt->autoV
2d4f0 61 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a  acuum && N>0 ){.
2d500 20 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34          i = get4
2d510 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
2d520 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
2d530 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20  rmap(pCheck, i, 
2d540 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
2d550 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
2d560 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2d570 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61  }.#endif.    iPa
2d580 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f  ge = get4byte(pO
2d590 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71  vflData);.    sq
2d5a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2d5b0 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a  pOvflPage);.  }.
2d5c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2d5d0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
2d5e0 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e  Y_CHECK */..#ifn
2d5f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d600 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a  INTEGRITY_CHECK.
2d610 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73  /*.** Do various
2d620 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f   sanity checks o
2d630 6e 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  n a single page 
2d640 6f 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75  of a tree.  Retu
2d650 72 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64  rn.** the tree d
2d660 65 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65  epth.  Root page
2d670 73 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72  s return 0.  Par
2d680 65 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67  ents of root pag
2d690 65 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20  es.** return 1, 
2d6a0 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  and so forth..**
2d6b0 20 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b   .** These check
2d6c0 73 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a  s are done:.**.*
2d6d0 2a 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20  *      1.  Make 
2d6e0 73 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20  sure that cells 
2d6f0 61 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64  and freeblocks d
2d700 6f 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a  o not overlap.**
2d710 20 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f            but co
2d720 6d 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74  mbine to complet
2d730 65 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61  ely cover the pa
2d740 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20  ge..**  NO  2.  
2d750 4d 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b  Make sure cell k
2d760 65 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72  eys are in order
2d770 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61  ..**  NO  3.  Ma
2d780 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69  ke sure no key i
2d790 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
2d7a0 71 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f  qual to zLowerBo
2d7b0 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20  und..**  NO  4. 
2d7c0 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65   Make sure no ke
2d7d0 79 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  y is greater tha
2d7e0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55  n or equal to zU
2d7f0 70 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20  pperBound..**   
2d800 20 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65     5.  Check the
2d810 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76   integrity of ov
2d820 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
2d830 20 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73        6.  Recurs
2d840 69 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b  ively call check
2d850 54 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20  TreePage on all 
2d860 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20  children..**    
2d870 20 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61    7.  Verify tha
2d880 74 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61  t the depth of a
2d890 6c 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74  ll children is t
2d8a0 68 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20  he same..**     
2d8b0 20 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   8.  Make sure t
2d8c0 68 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c  his page is at l
2d8d0 65 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72  east 33% full or
2d8e0 20 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20   else it is.**  
2d8f0 20 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74          the root
2d900 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f   of the tree..*/
2d910 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
2d920 6b 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74  kTreePage(.  Int
2d930 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
2d940 2c 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f  ,  /* Context fo
2d950 72 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65  r the sanity che
2d960 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  ck */.  int iPag
2d970 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
2d980 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2d990 74 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63  the page to chec
2d9a0 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  k */.  MemPage *
2d9b0 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
2d9c0 50 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  Parent page */. 
2d9d0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
2d9e0 6e 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74  ntext  /* Parent
2d9f0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
2da00 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2da10 0a 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65  .  int i, rc, de
2da20 70 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63  pth, d2, pgno, c
2da30 6e 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63  nt;.  int hdr, c
2da40 65 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20  ellStart;.  int 
2da50 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74  nCell;.  u8 *dat
2da60 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
2da70 42 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65  Bt;.  int usable
2da80 53 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f  Size;.  char zCo
2da90 6e 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68  ntext[100];.  ch
2daa0 61 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69  ar *hit;..  sqli
2dab0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2dac0 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
2dad0 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25  Context, "Page %
2dae0 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20  d: ", iPage);.. 
2daf0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2db00 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20  he page exists. 
2db10 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65   */.  pBt = pChe
2db20 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c  ck->pBt;.  usabl
2db30 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2db40 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69  bleSize;.  if( i
2db50 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
2db60 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52   0;.  if( checkR
2db70 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ef(pCheck, iPage
2db80 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74  , zParentContext
2db90 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
2dba0 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
2dbb0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
2dbc0 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20  t, (Pgno)iPage, 
2dbd0 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29  &pPage, 0))!=0 )
2dbe0 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
2dbf0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
2dc00 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75  ntext,.       "u
2dc10 6e 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65  nable to get the
2dc20 20 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64   page. error cod
2dc30 65 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20  e=%d", rc);.    
2dc40 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2dc50 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
2dc60 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
2dc70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21  Page, pParent))!
2dc80 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =0 ){.    checkA
2dc90 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
2dca0 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2dcc0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2dcd0 50 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65  Page() returns e
2dce0 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72  rror code %d", r
2dcf0 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  c);.    releaseP
2dd00 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2dd10 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
2dd20 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c   /* Check out al
2dd30 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a  l the cells..  *
2dd40 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20  /.  depth = 0;. 
2dd50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
2dd60 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65  e->nCell && pChe
2dd70 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  ck->mxErr; i++){
2dd80 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  .    u8 *pCell;.
2dd90 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
2dda0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
2ddb0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79      /* Check pay
2ddc0 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  load overflow pa
2ddd0 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ges.    */.    s
2dde0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2ddf0 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
2de00 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
2de10 20 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65           "On tre
2de20 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25  e page %d cell %
2de30 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b  d: ", iPage, i);
2de40 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2de50 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a  dCell(pPage,i);.
2de60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2de70 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2de80 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
2de90 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f  );.    sz = info
2dea0 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  .nData;.    if( 
2deb0 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
2dec0 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79   sz += info.nKey
2ded0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
2dee0 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
2def0 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e  );.    if( sz>in
2df00 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
2df10 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28     int nPage = (
2df20 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  sz - info.nLocal
2df30 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   + usableSize - 
2df40 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d  5)/(usableSize -
2df50 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20   4);.      Pgno 
2df60 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
2df70 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
2df80 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66  iOverflow]);.#if
2df90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2dfa0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2dfb0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2dfc0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
2dfd0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
2dfe0 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  eck, pgnoOvfl, P
2dff0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
2e000 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
2e010 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2e020 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73  f.      checkLis
2e030 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e  t(pCheck, 0, pgn
2e040 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43  oOvfl, nPage, zC
2e050 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a  ontext);.    }..
2e060 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e      /* Check san
2e070 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c  ity of left chil
2e080 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  d page..    */. 
2e090 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2e0a0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  eaf ){.      pgn
2e0b0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
2e0c0 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
2e0d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2e0e0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
2e0f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2e100 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
2e110 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
2e120 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
2e130 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
2e140 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2e150 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65  f.      d2 = che
2e160 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63  ckTreePage(pChec
2e170 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f  k,pgno,pPage,zCo
2e180 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  ntext);.      if
2e190 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70  ( i>0 && d2!=dep
2e1a0 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  th ){.        ch
2e1b0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
2e1c0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
2e1d0 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68  Child page depth
2e1e0 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20   differs");.    
2e1f0 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20    }.      depth 
2e200 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = d2;.    }.  }.
2e210 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e220 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2e230 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2e240 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2e250 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2e260 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2e270 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65  tf(sizeof(zConte
2e280 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  xt), zContext, .
2e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2a0 20 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64       "On page %d
2e2b0 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a   at right child:
2e2c0 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e   ", iPage);.#ifn
2e2d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e2e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2e2f0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2e300 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  um ){.      chec
2e310 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
2e320 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
2e330 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20  EE, iPage, 0);. 
2e340 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2e350 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
2e360 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67  heck, pgno, pPag
2e370 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
2e380 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  }. .  /* Check f
2e390 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65  or complete cove
2e3a0 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  rage of the page
2e3b0 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70  .  */.  data = p
2e3c0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
2e3d0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2e3e0 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73  ffset;.  hit = s
2e3f0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 75 73 61  qliteMalloc( usa
2e400 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
2e410 20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73   hit ){.    mems
2e420 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62  et(hit, 1, get2b
2e430 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2e440 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  ));.    nCell = 
2e450 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2e460 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
2e470 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
2e480 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
2e490 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2e4a0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
2e4b0 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
2e4c0 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
2e4d0 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
2e4e0 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 63 65     int size = ce
2e4f0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2e500 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
2e510 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2e520 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e  if( (pc+size-1)>
2e530 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70  =usableSize || p
2e540 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  c<0 ){.        c
2e550 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
2e560 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
2e570 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
2e580 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
2e590 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
2e5a0 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
2e5b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e5c0 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65     for(j=pc+size
2e5d0 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20  -1; j>=pc; j--) 
2e5e0 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
2e5f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
2e600 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74  cnt=0, i=get2byt
2e610 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
2e620 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65   i>0 && i<usable
2e630 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30  Size && cnt<1000
2e640 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 63  0; .           c
2e650 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  nt++){.      int
2e660 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
2e670 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20  (&data[i+2]);.  
2e680 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
2e690 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e   if( (i+size-1)>
2e6a0 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69  =usableSize || i
2e6b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  <0 ){.        ch
2e6c0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
2e6d0 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20  eck, 0,  .      
2e6e0 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
2e6f0 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
2e700 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
2e710 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
2e720 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e730 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d     for(j=i+size-
2e740 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69  1; j>=i; j--) hi
2e750 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  t[j]++;.      }.
2e760 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62 79        i = get2by
2e770 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20  te(&data[i]);.  
2e780 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e    }.    for(i=cn
2e790 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a  t=0; i<usableSiz
2e7a0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
2e7b0 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a  f( hit[i]==0 ){.
2e7c0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
2e7d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
2e7e0 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  it[i]>1 ){.     
2e7f0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
2e800 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20  g(pCheck, 0,.   
2e810 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65         "Multiple
2e820 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 25   uses for byte %
2e830 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69  d of page %d", i
2e840 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2e850 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2e860 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
2e870 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20  nt!=data[hdr+7] 
2e880 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
2e890 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
2e8a0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 46  0, .          "F
2e8b0 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
2e8c0 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f 72  is %d byte repor
2e8d0 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67  ted as %d on pag
2e8e0 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  e %d",.         
2e8f0 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37   cnt, data[hdr+7
2e900 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d  ], iPage);.    }
2e910 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
2e920 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65 61  e(hit);..  relea
2e930 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2e940 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31 3b   return depth+1;
2e950 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2e960 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
2e970 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
2e980 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e990 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
2e9a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2e9b0 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70 6c  ine does a compl
2e9c0 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68 65  ete check of the
2e9d0 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69 6c   given BTree fil
2e9e0 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a 2a  e.  aRoot[] is.*
2e9f0 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 61  * an array of pa
2ea00 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72 65  ges numbers were
2ea10 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62 65   each page numbe
2ea20 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  r is the root pa
2ea30 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c 65  ge of.** a table
2ea40 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65 20  .  nRoot is the 
2ea50 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
2ea60 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a 2a  s in aRoot..**.*
2ea70 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2ea80 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69 73  checks out, this
2ea90 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2eaa0 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65 74   NULL.  If somet
2eab0 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73 73  hing is.** amiss
2eac0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
2ead0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
2eae0 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
2eaf0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
2eb00 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  .** and a pointe
2eb10 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72 20  r to that error 
2eb20 6d 65 73 73 61 67 65 20 69 73 20 72 65 74 75 72  message is retur
2eb30 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ned.  The callin
2eb40 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  g function.** is
2eb50 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2eb60 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 72 72   freeing the err
2eb70 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
2eb80 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 63  it is done..*/.c
2eb90 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
2eba0 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  eIntegrityCheck(
2ebb0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
2ebc0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f   /* The btree to
2ebd0 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20   be checked */. 
2ebe0 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20 2f   int *aRoot,   /
2ebf0 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72 6f  * An array of ro
2ec00 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  ot pages numbers
2ec10 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c 20   for individual 
2ec20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  trees */.  int n
2ec30 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62  Root,    /* Numb
2ec40 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
2ec50 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e   aRoot[] */.  in
2ec60 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20 53  t mxErr,    /* S
2ec70 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65 72  top reporting er
2ec80 72 6f 72 73 20 61 66 74 65 72 20 74 68 69 73 20  rors after this 
2ec90 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  many */.  int *p
2eca0 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74 65  nErr    /* Write
2ecb0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
2ecc0 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20 76  s seen to this v
2ecd0 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ariable */.){.  
2ece0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 65  int i;.  int nRe
2ecf0 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b  f;.  IntegrityCk
2ed00 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68 61   sCheck;.  BtSha
2ed10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2ed20 74 3b 0a 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c  t;..  nRef = sql
2ed30 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
2ed40 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
2ed50 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57    if( lockBtreeW
2ed60 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c  ithRetry(p)!=SQL
2ed70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2ed80 74 75 72 6e 20 73 71 6c 69 74 65 53 74 72 44 75  turn sqliteStrDu
2ed90 70 28 22 55 6e 61 62 6c 65 20 74 6f 20 61 63 71  p("Unable to acq
2eda0 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  uire a read lock
2edb0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2edc0 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b  ");.  }.  sCheck
2edd0 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43  .pBt = pBt;.  sC
2ede0 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42  heck.pPager = pB
2edf0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68  t->pPager;.  sCh
2ee00 65 63 6b 2e 6e 50 61 67 65 20 3d 20 73 71 6c 69  eck.nPage = sqli
2ee10 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2ee20 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29  t(sCheck.pPager)
2ee30 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72  ;.  sCheck.mxErr
2ee40 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65   = mxErr;.  sChe
2ee50 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 2a  ck.nErr = 0;.  *
2ee60 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e 64  pnErr = 0;.#ifnd
2ee70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ee80 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
2ee90 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20 29  pBt->nTrunc!=0 )
2eea0 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50 61  {.    sCheck.nPa
2eeb0 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  ge = pBt->nTrunc
2eec0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
2eed0 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3d  f( sCheck.nPage=
2eee0 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b  =0 ){.    unlock
2eef0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
2ef00 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
2ef10 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61  ;.  }.  sCheck.a
2ef20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 4d 61 6c  nRef = sqliteMal
2ef30 6c 6f 63 52 61 77 28 20 28 73 43 68 65 63 6b 2e  locRaw( (sCheck.
2ef40 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28  nPage+1)*sizeof(
2ef50 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29  sCheck.anRef[0])
2ef60 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63   );.  if( !sChec
2ef70 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75  k.anRef ){.    u
2ef80 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
2ef90 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e  ed(pBt);.    *pn
2efa0 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Err = 1;.    ret
2efb0 75 72 6e 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  urn sqlite3MPrin
2efc0 74 66 28 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61  tf("Unable to ma
2efd0 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c 20  lloc %d bytes", 
2efe0 0a 20 20 20 20 20 20 20 20 28 73 43 68 65 63 6b  .        (sCheck
2eff0 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66  .nPage+1)*sizeof
2f000 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d  (sCheck.anRef[0]
2f010 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ));.  }.  for(i=
2f020 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  0; i<=sCheck.nPa
2f030 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b  ge; i++){ sCheck
2f040 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d  .anRef[i] = 0; }
2f050 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42  .  i = PENDING_B
2f060 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20  YTE_PAGE(pBt);. 
2f070 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e   if( i<=sCheck.n
2f080 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65  Page ){.    sChe
2f090 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b  ck.anRef[i] = 1;
2f0a0 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45  .  }.  sCheck.zE
2f0b0 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  rrMsg = 0;..  /*
2f0c0 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
2f0d0 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65 65  rity of the free
2f0e0 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63  list.  */.  chec
2f0f0 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31  kList(&sCheck, 1
2f100 2c 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  , get4byte(&pBt-
2f110 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
2f120 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  2]),.           
2f130 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
2f140 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2f150 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69  ]), "Main freeli
2f160 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68  st: ");..  /* Ch
2f170 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c  eck all the tabl
2f180 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
2f190 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73  =0; i<nRoot && s
2f1a0 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b  Check.mxErr; i++
2f1b0 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74  ){.    if( aRoot
2f1c0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
2f1d0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
2f1e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2f1f0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
2f200 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f  utoVacuum && aRo
2f210 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  ot[i]>1 ){.     
2f220 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43   checkPtrmap(&sC
2f230 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20  heck, aRoot[i], 
2f240 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c  PTRMAP_ROOTPAGE,
2f250 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   0, 0);.    }.#e
2f260 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72  ndif.    checkTr
2f270 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20  eePage(&sCheck, 
2f280 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69  aRoot[i], 0, "Li
2f290 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73  st of tree roots
2f2a0 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  : ");.  }..  /* 
2f2b0 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20  Make sure every 
2f2c0 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  page in the file
2f2d0 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20   is referenced. 
2f2e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   */.  for(i=1; i
2f2f0 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26  <=sCheck.nPage &
2f300 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20  & sCheck.mxErr; 
2f310 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  i++){.#ifdef SQL
2f320 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2f330 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65  UUM.    if( sChe
2f340 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29  ck.anRef[i]==0 )
2f350 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
2f360 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
2f370 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e  0, "Page %d is n
2f380 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a  ever used", i);.
2f390 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
2f3a0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2f3b0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
2f3c0 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75  -vacuum, make su
2f3d0 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e  re no tables con
2f3e0 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65  tain.    ** refe
2f3f0 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65  rences to pointe
2f400 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20  r-map pages..   
2f410 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65   */.    if( sChe
2f420 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26  ck.anRef[i]==0 &
2f430 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41  & .       (PTRMA
2f440 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29  P_PAGENO(pBt, i)
2f450 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74  !=i || !pBt->aut
2f460 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
2f470 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
2f480 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
2f490 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
2f4a0 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
2f4b0 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61      if( sCheck.a
2f4c0 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20  nRef[i]!=0 && . 
2f4d0 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41        (PTRMAP_PA
2f4e0 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20  GENO(pBt, i)==i 
2f4f0 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  && pBt->autoVacu
2f500 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
2f510 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
2f520 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72  eck, 0, "Pointer
2f530 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73 20   map page %d is 
2f540 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b  referenced", i);
2f550 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2f560 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
2f570 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20  e this analysis 
2f580 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e  did not leave an
2f590 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a  y unref() pages.
2f5a0 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72    */.  unlockBtr
2f5b0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
2f5c0 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73  .  if( nRef != s
2f5d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
2f5e0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
2f5f0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
2f600 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
2f610 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74  0, .      "Outst
2f620 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e  anding page coun
2f630 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74  t goes from %d t
2f640 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69 73  o %d during this
2f650 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20   analysis",.    
2f660 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50    nRef, sqlite3P
2f670 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
2f680 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  ->pPager).    );
2f690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
2f6a0 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20    up and report 
2f6b0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73  errors..  */.  s
2f6c0 71 6c 69 74 65 46 72 65 65 28 73 43 68 65 63 6b  qliteFree(sCheck
2f6d0 2e 61 6e 52 65 66 29 3b 0a 20 20 2a 70 6e 45 72  .anRef);.  *pnEr
2f6e0 72 20 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 3b  r = sCheck.nErr;
2f6f0 0a 20 20 72 65 74 75 72 6e 20 73 43 68 65 63 6b  .  return sCheck
2f700 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a 23 65 6e 64  .zErrMsg;.}.#end
2f710 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2f720 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
2f730 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K */../*.** Retu
2f740 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
2f750 6e 61 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65  name of the unde
2f760 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
2f770 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
2f780 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
2f790 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72  eGetFilename(Btr
2f7a0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
2f7b0 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
2f7c0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
2f7d0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
2f7e0 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
2f7f0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ger);.}../*.** R
2f800 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61  eturn the pathna
2f810 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
2f820 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
2f830 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
2f840 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
2f850 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  ar *sqlite3Btree
2f860 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65  GetDirname(Btree
2f870 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
2f880 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
2f890 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
2f8a0 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d  lite3PagerDirnam
2f8b0 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
2f8c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2f8d0 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  rn the pathname 
2f8e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2f8f0 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61 74  ile for this dat
2f900 61 62 61 73 65 2e 20 54 68 65 20 72 65 74 75 72  abase. The retur
2f910 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  n.** value of th
2f920 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
2f930 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73  e same regardles
2f940 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
2f950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2f960 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
2f970 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 63 6f 6e  d or not..*/.con
2f980 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
2f990 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
2f9a0 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
2f9b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
2f9c0 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
2f9d0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
2f9e0 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  gerJournalname(p
2f9f0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
2fa00 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2fa10 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
2fa20 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d  .** Copy the com
2fa30 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
2fa40 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42   pBtFrom into pB
2fa50 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74  tTo.  A transact
2fa60 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61  ion.** must be a
2fa70 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66  ctive for both f
2fa80 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
2fa90 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 42 74  size of file pBt
2faa0 46 72 6f 6d 20 6d 61 79 20 62 65 20 72 65 64 75  From may be redu
2fab0 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ced by this oper
2fac0 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79  ation..** If any
2fad0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
2fae0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
2faf0 6e 20 6f 6e 20 70 42 74 46 72 6f 6d 20 69 73 20  n on pBtFrom is 
2fb00 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
2fb10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2fb20 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
2fb30 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
2fb40 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  m){.  int rc = S
2fb50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f  QLITE_OK;.  Pgno
2fb60 20 69 2c 20 6e 50 61 67 65 2c 20 6e 54 6f 50 61   i, nPage, nToPa
2fb70 67 65 2c 20 69 53 6b 69 70 3b 0a 0a 20 20 42 74  ge, iSkip;..  Bt
2fb80 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d 20  Shared *pBtTo = 
2fb90 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53 68  pTo->pBt;.  BtSh
2fba0 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d 20  ared *pBtFrom = 
2fbb0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 0a 20 20 69  pFrom->pBt;..  i
2fbc0 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21  f( pTo->inTrans!
2fbd0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
2fbe0 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d  pFrom->inTrans!=
2fbf0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2fc00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fc10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2fc20 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72  ( pBtTo->pCursor
2fc30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2fc40 5f 42 55 53 59 3b 0a 20 20 6e 54 6f 50 61 67 65  _BUSY;.  nToPage
2fc50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
2fc60 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e  agecount(pBtTo->
2fc70 70 50 61 67 65 72 29 3b 0a 20 20 6e 50 61 67 65  pPager);.  nPage
2fc80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
2fc90 61 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d  agecount(pBtFrom
2fca0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b  ->pPager);.  iSk
2fcb0 69 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  ip = PENDING_BYT
2fcc0 45 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 20  E_PAGE(pBtTo);. 
2fcd0 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
2fce0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 50  LITE_OK && i<=nP
2fcf0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  age; i++){.    D
2fd00 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
2fd10 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70      if( i==iSkip
2fd20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2fd30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2fd40 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70  erGet(pBtFrom->p
2fd50 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61  Pager, i, &pDbPa
2fd60 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2fd70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
2fd80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  = sqlite3PagerOv
2fd90 65 72 77 72 69 74 65 28 70 42 74 54 6f 2d 3e 70  erwrite(pBtTo->p
2fda0 50 61 67 65 72 2c 20 69 2c 20 73 71 6c 69 74 65  Pager, i, sqlite
2fdb0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
2fdc0 62 50 61 67 65 29 29 3b 0a 20 20 20 20 73 71 6c  bPage));.    sql
2fdd0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2fde0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  DbPage);.  }..  
2fdf0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
2fe00 73 20 73 68 72 69 6e 6b 69 6e 67 2c 20 6a 6f 75  s shrinking, jou
2fe10 72 6e 61 6c 20 74 68 65 20 70 61 67 65 73 20 74  rnal the pages t
2fe20 68 61 74 20 61 72 65 20 62 65 69 6e 67 20 74 72  hat are being tr
2fe30 75 6e 63 61 74 65 64 0a 20 20 2a 2a 20 73 6f 20  uncated.  ** so 
2fe40 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
2fe50 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20   rolled back if 
2fe60 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
2fe70 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ..  */.  for(i=n
2fe80 50 61 67 65 2b 31 3b 20 72 63 3d 3d 53 51 4c 49  Page+1; rc==SQLI
2fe90 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 6e 54 6f 50  TE_OK && i<=nToP
2fea0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  age; i++){.    D
2feb0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
2fec0 20 20 20 20 69 66 28 20 69 3d 3d 69 53 6b 69 70      if( i==iSkip
2fed0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2fee0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2fef0 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61  erGet(pBtTo->pPa
2ff00 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67 65  ger, i, &pDbPage
2ff10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2ff20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20 3d 20  break;.    rc = 
2ff30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ff40 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
2ff50 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2ff60 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
2ff70 20 20 20 20 2f 2a 20 59 65 61 68 2e 20 20 49 74      /* Yeah.  It
2ff80 20 73 65 65 6d 73 20 77 69 65 72 64 20 74 6f 20   seems wierd to 
2ff90 63 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28 29  call DontWrite()
2ffa0 20 72 69 67 68 74 20 61 66 74 65 72 20 57 72 69   right after Wri
2ffb0 74 65 28 29 2e 20 20 42 75 74 0a 20 20 20 20 2a  te().  But.    *
2ffc0 2a 20 74 68 61 74 20 69 73 20 62 65 63 61 75 73  * that is becaus
2ffd0 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  e the names of t
2ffe0 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65 73 20  hose procedures 
2fff0 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a  do not exactly .
30000 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74      ** represent
30010 20 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20 20   what they do.  
30020 57 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20 6d  Write() really m
30030 65 61 6e 73 20 22 70 75 74 20 74 68 69 73 20 70  eans "put this p
30040 61 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  age in the.    *
30050 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
30060 61 6c 20 61 6e 64 20 6d 61 72 6b 20 69 74 20 61  al and mark it a
30070 73 20 64 69 72 74 79 20 73 6f 20 74 68 61 74 20  s dirty so that 
30080 69 74 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74  it will be writt
30090 65 6e 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  en.    ** to the
300a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6c   database file l
300b0 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69 74  ater."  DontWrit
300c0 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20 73  e() undoes the s
300d0 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20 20  econd part of.  
300e0 20 20 2a 2a 20 74 68 61 74 20 61 6e 64 20 70 72    ** that and pr
300f0 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 20  events the page 
30100 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74 74  from being writt
30110 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
30120 73 65 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  se.  The.    ** 
30130 70 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e  page is still on
30140 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
30150 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20  urnal, though.  
30160 41 6e 64 20 74 68 61 74 20 69 73 20 74 68 65 20  And that is the 
30170 77 68 6f 6c 65 0a 20 20 20 20 2a 2a 20 70 6f 69  whole.    ** poi
30180 6e 74 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 3a  nt of this loop:
30190 20 74 6f 20 70 75 74 20 70 61 67 65 73 20 6f 6e   to put pages on
301a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
301b0 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 73 71  urnal. */.    sq
301c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
301d0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
301e0 69 66 28 20 21 72 63 20 26 26 20 6e 50 61 67 65  if( !rc && nPage
301f0 3c 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20  <nToPage ){.    
30200 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30210 72 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d  rTruncate(pBtTo-
30220 3e 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  >pPager, nPage);
30230 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29  .  }..  if( rc )
30240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
30250 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b  eeRollback(pTo);
30260 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
30270 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
30280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
30290 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UM */../*.** Ret
302a0 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
302b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
302c0 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
302d0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
302e0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
302f0 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
30300 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
30310 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f  NS_WRITE));.}../
30320 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  *.** Return non-
30330 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74 65 6d  zero if a statem
30340 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
30350 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  is active..*/.in
30360 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  t sqlite3BtreeIs
30370 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  InStmt(Btree *p)
30380 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70  {.  return (p->p
30390 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e  Bt && p->pBt->in
303a0 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
303b0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
303c0 69 66 20 61 20 72 65 61 64 20 28 6f 72 20 77 72  if a read (or wr
303d0 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
303e0 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
303f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
30400 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72  sInReadTrans(Btr
30410 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
30420 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
30430 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29  ns!=TRANS_NONE))
30440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
30450 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
30460 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
30470 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
30480 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
30490 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72 65  * a single share
304a0 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65 6d  d-btree. The mem
304b0 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20 63  ory is used by c
304c0 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20 69  lient code for i
304d0 74 27 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f  t's own.** purpo
304e0 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  ses (for example
304f0 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67  , to store a hig
30500 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61  h-level schema a
30510 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
30520 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  ** the shared-bt
30530 72 65 65 29 2e 20 54 68 65 20 62 74 72 65 65 20  ree). The btree 
30540 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65  layer manages re
30550 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67  ference counting
30560 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   issues..**.** T
30570 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
30580 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  is is called on 
30590 61 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20  a shared-btree, 
305a0 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 20  nBytes bytes of 
305b0 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c  memory.** are al
305c0 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c  located, zeroed,
305d0 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f   and returned to
305e0 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72   the caller. For
305f0 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
30600 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42   .** call the nB
30610 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69  ytes parameter i
30620 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20  s ignored and a 
30630 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
30640 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d  ame blob.** of m
30650 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20  emory returned. 
30660 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f  .**.** Just befo
30670 72 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  re the shared-bt
30680 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ree is closed, t
30690 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73  he function pass
306a0 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78 46  ed as the .** xF
306b0 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65  ree argument whe
306c0 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  n the memory all
306d0 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65  ocation was made
306e0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74   is invoked on t
306f0 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61  he .** blob of a
30700 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e  llocated memory.
30710 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
30720 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73  hould not call s
30730 71 6c 69 74 65 46 72 65 65 28 29 0a 2a 2a 20 6f  qliteFree().** o
30740 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68  n the memory, th
30750 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 64 6f  e btree layer do
30760 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64  es that..*/.void
30770 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 53 63   *sqlite3BtreeSc
30780 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c 20 69  hema(Btree *p, i
30790 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69 64 28  nt nBytes, void(
307a0 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a 29 29  *xFree)(void *))
307b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
307c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
307d0 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  ( !pBt->pSchema 
307e0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68  ){.    pBt->pSch
307f0 65 6d 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ema = sqliteMall
30800 6f 63 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20  oc(nBytes);.    
30810 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
30820 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20   = xFree;.  }.  
30830 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63 68  return pBt->pSch
30840 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ema;.}../*.** Re
30850 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 6f  turn true if ano
30860 74 68 65 72 20 75 73 65 72 20 6f 66 20 74 68 65  ther user of the
30870 20 73 61 6d 65 20 73 68 61 72 65 64 20 62 74 72   same shared btr
30880 65 65 20 61 73 20 74 68 65 20 61 72 67 75 6d 65  ee as the argume
30890 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f 6c  nt.** handle hol
308a0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
308b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c 69  lock on the sqli
308c0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
308d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
308e0 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65 64  treeSchemaLocked
308f0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
30900 74 75 72 6e 20 28 71 75 65 72 79 54 61 62 6c 65  turn (queryTable
30910 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
30920 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21  OOT, READ_LOCK)!
30930 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a  =SQLITE_OK);.}..
30940 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30950 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
30960 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  E./*.** Obtain a
30970 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
30980 6c 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61  le whose root pa
30990 67 65 20 69 73 20 69 54 61 62 2e 20 20 54 68 65  ge is iTab.  The
309a0 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 61 20 77 72  .** lock is a wr
309b0 69 74 65 20 6c 6f 63 6b 20 69 66 20 69 73 57 72  ite lock if isWr
309c0 69 74 65 6c 6f 63 6b 20 69 73 20 74 72 75 65 20  itelock is true 
309d0 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a 2a  or a read lock.*
309e0 2a 20 69 66 20 69 74 20 69 73 20 66 61 6c 73 65  * if it is false
309f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30a00 42 74 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42  BtreeLockTable(B
30a10 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61  tree *p, int iTa
30a20 62 2c 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63  b, u8 isWriteLoc
30a30 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
30a40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 6c  QLITE_OK;.  u8 l
30a50 6f 63 6b 54 79 70 65 20 3d 20 28 69 73 57 72 69  ockType = (isWri
30a60 74 65 4c 6f 63 6b 3f 57 52 49 54 45 5f 4c 4f 43  teLock?WRITE_LOC
30a70 4b 3a 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  K:READ_LOCK);.  
30a80 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c  rc = queryTableL
30a90 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63  ock(p, iTab, loc
30aa0 6b 54 79 70 65 29 3b 0a 20 20 69 66 28 20 72 63  kType);.  if( rc
30ab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30ac0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c     rc = lockTabl
30ad0 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54  e(p, iTab, lockT
30ae0 79 70 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ype);.  }.  retu
30af0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
30b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30b10 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
30b20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 73  .** Argument pCs
30b30 72 20 6d 75 73 74 20 62 65 20 61 20 63 75 72 73  r must be a curs
30b40 6f 72 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72  or opened for wr
30b50 69 74 69 6e 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20  iting on an .** 
30b60 49 4e 54 4b 45 59 20 74 61 62 6c 65 20 63 75 72  INTKEY table cur
30b70 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
30b80 61 74 20 61 20 76 61 6c 69 64 20 74 61 62 6c 65  at a valid table
30b90 20 65 6e 74 72 79 2e 20 0a 2a 2a 20 54 68 69 73   entry. .** This
30ba0 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66 69   function modifi
30bb0 65 73 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  es the data stor
30bc0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
30bd0 61 74 20 65 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c  at entry..** Onl
30be0 79 20 74 68 65 20 64 61 74 61 20 63 6f 6e 74 65  y the data conte
30bf0 6e 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6d  nt may only be m
30c00 6f 64 69 66 69 65 64 2c 20 69 74 20 69 73 20 6e  odified, it is n
30c10 6f 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  ot possible.** t
30c20 6f 20 63 68 61 6e 67 65 20 74 68 65 20 6c 65 6e  o change the len
30c30 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
30c40 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  stored..*/.int s
30c50 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61  qlite3BtreePutDa
30c60 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 73  ta(BtCursor *pCs
30c70 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
30c80 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 7a 29  32 amt, void *z)
30c90 7b 0a 0a 20 20 61 73 73 65 72 74 28 70 43 73 72  {..  assert(pCsr
30ca0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
30cb0 6c 65 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d  le);.  if( pCsr-
30cc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
30cd0 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
30ce0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30cf0 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f  _ABORT;.  }..  /
30d00 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20 70 72 65  * Check some pre
30d10 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20 20 2a  conditions: .  *
30d20 2a 20 20 20 28 61 29 20 74 68 65 20 63 75 72 73  *   (a) the curs
30d30 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f 72 20 77  or is open for w
30d40 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20 20 20 28  riting,.  **   (
30d50 62 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  b) there is no r
30d60 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
30d70 74 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f 64 69  table being modi
30d80 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a 20 20 20  fied and.  **   
30d90 28 63 29 20 74 68 65 20 63 75 72 73 6f 72 20 70  (c) the cursor p
30da0 6f 69 6e 74 73 20 61 74 20 61 20 76 61 6c 69 64  oints at a valid
30db0 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e 74 4b 65   row of an intKe
30dc0 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  y table..  */.  
30dd0 69 66 28 20 21 70 43 73 72 2d 3e 77 72 46 6c 61  if( !pCsr->wrFla
30de0 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
30df0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
30e00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
30e10 70 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCsr->pBtree->pB
30e20 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20  t->readOnly .   
30e30 20 20 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e         && pCsr->
30e40 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 69 6e 54  pBtree->pBt->inT
30e50 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
30e60 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
30e70 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
30e80 70 43 73 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCsr->pBtree, pC
30e90 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  sr->pgnoRoot, pC
30ea0 73 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  sr) ){.    retur
30eb0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
30ec0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
30ed0 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
30ee0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
30ef0 20 20 7d 0a 20 20 69 66 28 20 70 43 73 72 2d 3e    }.  if( pCsr->
30f00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
30f10 4e 56 41 4c 49 44 20 7c 7c 20 21 70 43 73 72 2d  NVALID || !pCsr-
30f20 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  >pPage->intKey )
30f30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
30f40 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
30f50 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
30f60 61 79 6c 6f 61 64 28 70 43 73 72 2c 20 6f 66 66  ayload(pCsr, off
30f70 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
30f80 6e 65 64 20 63 68 61 72 20 2a 29 7a 2c 20 30 2c  ned char *)z, 0,
30f90 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53   1);.}../* .** S
30fa0 65 74 20 61 20 66 6c 61 67 20 6f 6e 20 74 68 69  et a flag on thi
30fb0 73 20 63 75 72 73 6f 72 20 74 6f 20 63 61 63 68  s cursor to cach
30fc0 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20  e the locations 
30fd0 6f 66 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  of pages from th
30fe0 65 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 6c  e .** overflow l
30ff0 69 73 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  ist for the curr
31000 65 6e 74 20 72 6f 77 2e 20 54 68 69 73 20 69 73  ent row. This is
31010 20 75 73 65 64 20 62 79 20 63 75 72 73 6f 72 73   used by cursors
31020 20 6f 70 65 6e 65 64 0a 2a 2a 20 66 6f 72 20 69   opened.** for i
31030 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
31040 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  IO only..**.** T
31050 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
31060 73 20 61 20 66 6c 61 67 20 6f 6e 6c 79 2e 20 54  s a flag only. T
31070 68 65 20 61 63 74 75 61 6c 20 70 61 67 65 20 6c  he actual page l
31080 6f 63 61 74 69 6f 6e 20 63 61 63 68 65 0a 2a 2a  ocation cache.**
31090 20 28 73 74 6f 72 65 64 20 69 6e 20 42 74 43 75   (stored in BtCu
310a0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
310b0 29 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  ) is allocated a
310c0 6e 64 20 75 73 65 64 20 62 79 20 66 75 6e 63 74  nd used by funct
310d0 69 6f 6e 0a 2a 2a 20 61 63 63 65 73 73 50 61 79  ion.** accessPay
310e0 6c 6f 61 64 28 29 20 28 74 68 65 20 77 6f 72 6b  load() (the work
310f0 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
31100 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
31110 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
31120 33 42 74 72 65 65 50 75 74 44 61 74 61 28 29 29  3BtreePutData())
31130 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
31140 33 42 74 72 65 65 43 61 63 68 65 4f 76 65 72 66  3BtreeCacheOverf
31150 6c 6f 77 28 42 74 43 75 72 73 6f 72 20 2a 70 43  low(BtCursor *pC
31160 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 21 70  ur){.  assert(!p
31170 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
31180 61 6e 64 6c 65 29 3b 0a 20 20 61 73 73 65 72 74  andle);.  assert
31190 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
311a0 77 29 3b 0a 20 20 70 43 75 72 2d 3e 69 73 49 6e  w);.  pCur->isIn
311b0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 3d 20 31  crblobHandle = 1
311c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a                 ;.}.#endif.