System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 7371b4d625be80b6c57ba67841ffdd1c69e0041d:


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 31 20 32 30 30 38 2f 30 38 2f  c,v 1.1 2008/08/
0190: 30 36 20 32 31 3a 34 38 3a 30 36 20 72 6d 73 69  06 21:48:06 rmsi
01a0: 6d 70 73 6f 6e 20 45 78 70 20 24 0a 2a 2a 0a 2a  mpson Exp $.**.*
01b0: 2a 20 54 68 69 73 20 66 69 6c 65 20 69 6d 70 6c  * This file impl
01c0: 65 6d 65 6e 74 73 20 61 20 65 78 74 65 72 6e 61  ements a externa
01d0: 6c 20 28 64 69 73 6b 2d 62 61 73 65 64 29 20 64  l (disk-based) d
01e0: 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 42 54  atabase using BT
01f0: 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20 74 68 65  rees..** See the
0200: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
0210: 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e 68 22 20  on "btreeInt.h" 
0220: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
0230: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 49  nformation..** I
0240: 6e 63 6c 75 64 69 6e 67 20 61 20 64 65 73 63 72  ncluding a descr
0250: 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c 65 20 66  iption of file f
0260: 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20 6f 76 65  ormat and an ove
0270: 72 76 69 65 77 20 6f 66 20 6f 70 65 72 61 74 69  rview of operati
0280: 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  on..*/.#include 
0290: 22 62 74 72 65 65 49 6e 74 2e 68 22 0a 0a 2f 2a  "btreeInt.h"../*
02a0: 0a 2a 2a 20 54 68 65 20 68 65 61 64 65 72 20 73  .** The header s
02b0: 74 72 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  tring that appea
02c0: 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  rs at the beginn
02d0: 69 6e 67 20 6f 66 20 65 76 65 72 79 0a 2a 2a 20  ing of every.** 
02e0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
02f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
0300: 20 63 68 61 72 20 7a 4d 61 67 69 63 48 65 61 64   char zMagicHead
0310: 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 46 49  er[] = SQLITE_FI
0320: 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f 2a 0a 2a  LE_HEADER;../*.*
0330: 2a 20 53 65 74 20 74 68 69 73 20 67 6c 6f 62 61  * Set this globa
0340: 6c 20 76 61 72 69 61 62 6c 65 20 74 6f 20 31 20  l variable to 1 
0350: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0360: 67 20 75 73 69 6e 67 20 74 68 65 20 54 52 41 43  g using the TRAC
0370: 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  E.** macro..*/.#
0380: 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  if 0.int sqlite3
0390: 42 74 72 65 65 54 72 61 63 65 3d 30 3b 20 20 2f  BtreeTrace=0;  /
03a0: 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65  * True to enable
03b0: 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 20 64 65   tracing */.# de
03c0: 66 69 6e 65 20 54 52 41 43 45 28 58 29 20 20 69  fine TRACE(X)  i
03d0: 66 28 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  f(sqlite3BtreeTr
03e0: 61 63 65 29 7b 70 72 69 6e 74 66 20 58 3b 66 66  ace){printf X;ff
03f0: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 7d 0a 23  lush(stdout);}.#
0400: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54 52  else.# define TR
0410: 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 0a  ACE(X).#endif...
0420: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0430: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
0440: 45 0a 2f 2a 0a 2a 2a 20 41 20 66 6c 61 67 20 74  E./*.** A flag t
0450: 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 74 68  o indicate wheth
0460: 65 72 20 6f 72 20 6e 6f 74 20 73 68 61 72 65 64  er or not shared
0470: 20 63 61 63 68 65 20 69 73 20 65 6e 61 62 6c 65   cache is enable
0480: 64 2e 20 20 41 6c 73 6f 2c 0a 2a 2a 20 61 20 6c  d.  Also,.** a l
0490: 69 73 74 20 6f 66 20 42 74 53 68 61 72 65 64 20  ist of BtShared 
04a0: 6f 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65  objects that are
04b0: 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61   eligible for pa
04c0: 72 74 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69  rticipation.** i
04d0: 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20  n shared cache. 
04e0: 20 54 68 65 20 76 61 72 69 61 62 6c 65 73 20 68   The variables h
04f0: 61 76 65 20 66 69 6c 65 20 73 63 6f 70 65 20 64  ave file scope d
0500: 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69  uring normal bui
0510: 6c 64 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20  lds,.** but the 
0520: 74 65 73 74 20 68 61 72 6e 65 73 73 20 6e 65 65  test harness nee
0530: 64 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ds to access the
0540: 73 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20  se variables so 
0550: 77 65 20 6d 61 6b 65 20 74 68 65 6d 0a 2a 2a 20  we make them.** 
0560: 67 6c 6f 62 61 6c 20 66 6f 72 20 74 65 73 74 20  global for test 
0570: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65  builds..*/.#ifde
0580: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0590: 53 68 61 72 65 64 20 2a 73 71 6c 69 74 65 33 53  Shared *sqlite3S
05a0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d  haredCacheList =
05b0: 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 53   0;.int sqlite3S
05c0: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
05d0: 64 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  d = 0;.#else.sta
05e0: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 73 71  tic BtShared *sq
05f0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
0600: 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  List = 0;.static
0610: 20 69 6e 74 20 73 71 6c 69 74 65 33 53 68 61 72   int sqlite3Shar
0620: 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 3d  edCacheEnabled =
0630: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69   0;.#endif.#endi
0640: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
0650: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
0660: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0670: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0680: 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  HE./*.** Enable 
0690: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  or disable the s
06a0: 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64 20  hared pager and 
06b0: 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73 2e  schema features.
06c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
06d0: 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65 63  ine has no effec
06e0: 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64 61  t on existing da
06f0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
0700: 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65  ns..** The share
0710: 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67 20  d cache setting 
0720: 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75 74  effects only fut
0730: 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ure calls to.** 
0740: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c 20  sqlite3_open(), 
0750: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
0760: 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65  , or sqlite3_ope
0770: 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  n_v2()..*/.int s
0780: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
0790: 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20 65  ared_cache(int e
07a0: 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74 65  nable){.  sqlite
07b0: 33 53 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  3SharedCacheEnab
07c0: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
07d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
07e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
07f0: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
0800: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
0810: 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f   int checkReadLo
0820: 63 6b 73 28 42 74 72 65 65 2a 2c 20 50 67 6e 6f  cks(Btree*, Pgno
0830: 2c 20 42 74 43 75 72 73 6f 72 2a 2c 20 69 36 34  , BtCursor*, i64
0840: 29 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  );...#ifdef SQLI
0850: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0860: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0870: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0880: 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c  ryTableLock(), l
0890: 6f 63 6b 54 61 62 6c 65 28 29 20 61 6e 64 20 75  ockTable() and u
08a0: 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 29  nlockAllTables()
08b0: 0a 20 20 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65  .  ** manipulate
08c0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
08d0: 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c  BtShared.pLock l
08e0: 69 6e 6b 65 64 20 6c 69 73 74 20 75 73 65 64 20  inked list used 
08f0: 74 6f 20 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68  to store.  ** sh
0900: 61 72 65 64 2d 63 61 63 68 65 20 74 61 62 6c 65  ared-cache table
0910: 20 6c 65 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66   level locks. If
0920: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 20   the library is 
0930: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
0940: 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61  e.  ** shared-ca
0950: 63 68 65 20 66 65 61 74 75 72 65 20 64 69 73 61  che feature disa
0960: 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65  bled, then there
0970: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e   is only ever on
0980: 65 20 75 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65  e user.  ** of e
0990: 61 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72  ach BtShared str
09a0: 75 63 74 75 72 65 20 61 6e 64 20 73 6f 20 74 68  ucture and so th
09b0: 69 73 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f  is locking is no
09c0: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 20 20  t necessary. .  
09d0: 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20 74 68 65  ** So define the
09e0: 20 6c 6f 63 6b 20 72 65 6c 61 74 65 64 20 66 75   lock related fu
09f0: 6e 63 74 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70  nctions as no-op
0a00: 73 2e 0a 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e  s..  */.  #defin
0a10: 65 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  e queryTableLock
0a20: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0a30: 4b 0a 20 20 23 64 65 66 69 6e 65 20 6c 6f 63 6b  K.  #define lock
0a40: 54 61 62 6c 65 28 61 2c 62 2c 63 29 20 53 51 4c  Table(a,b,c) SQL
0a50: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
0a60: 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
0a70: 28 61 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  (a).#endif..#ifn
0a80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0a90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
0aa0: 2a 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20  ** Query to see 
0ab0: 69 66 20 62 74 72 65 65 20 68 61 6e 64 6c 65 20  if btree handle 
0ac0: 70 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c  p may obtain a l
0ad0: 6f 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63  ock of type eLoc
0ae0: 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b  k .** (READ_LOCK
0af0: 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   or WRITE_LOCK) 
0b00: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
0b10: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
0b20: 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  . Return.** SQLI
0b30: 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63  TE_OK if the loc
0b40: 6b 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65  k may be obtaine
0b50: 64 20 28 62 79 20 63 61 6c 6c 69 6e 67 20 6c 6f  d (by calling lo
0b60: 63 6b 54 61 62 6c 65 28 29 29 2c 20 6f 72 0a 2a  ckTable()), or.*
0b70: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  * SQLITE_LOCKED 
0b80: 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
0b90: 63 20 69 6e 74 20 71 75 65 72 79 54 61 62 6c 65  c int queryTable
0ba0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
0bb0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
0bc0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
0bd0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
0be0: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
0bf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
0c00: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
0c10: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
0c20: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
0c30: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
0c40: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
0c50: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
0c60: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 69 73  .  .  /* This is
0c70: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
0c80: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
0c90: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
0ca0: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
0cb0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
0cc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
0cd0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
0ce0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
0cf0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
0d00: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
0d10: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
0d20: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
0d30: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
0d40: 69 66 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73  if( pBt->pExclus
0d50: 69 76 65 20 26 26 20 70 42 74 2d 3e 70 45 78 63  ive && pBt->pExc
0d60: 6c 75 73 69 76 65 21 3d 70 20 29 7b 0a 20 20 20  lusive!=p ){.   
0d70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
0d80: 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  OCKED;.  }..  /*
0d90: 20 54 68 69 73 20 28 61 6c 6f 6e 67 20 77 69 74   This (along wit
0da0: 68 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 20 69  h lockTable()) i
0db0: 73 20 77 68 65 72 65 20 74 68 65 20 52 65 61 64  s where the Read
0dc0: 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
0dd0: 20 69 73 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77   is.  ** dealt w
0de0: 69 74 68 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  ith. If the call
0df0: 65 72 20 69 73 20 71 75 65 72 79 69 6e 67 20 66  er is querying f
0e00: 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 61  or a read-lock a
0e10: 6e 64 20 74 68 65 20 66 6c 61 67 20 69 73 0a 20  nd the flag is. 
0e20: 20 2a 2a 20 73 65 74 2c 20 69 74 20 69 73 20 75   ** set, it is u
0e30: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 67  nconditionally g
0e40: 72 61 6e 74 65 64 20 2d 20 65 76 65 6e 20 69 66  ranted - even if
0e50: 20 74 68 65 72 65 20 61 72 65 20 77 72 69 74 65   there are write
0e60: 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f 6e 20 74  -locks.  ** on t
0e70: 68 65 20 74 61 62 6c 65 2e 20 49 66 20 61 20 77  he table. If a w
0e80: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 72 65 71  rite-lock is req
0e90: 75 65 73 74 65 64 2c 20 74 68 65 20 52 65 61 64  uested, the Read
0ea0: 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
0eb0: 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  .  ** is not con
0ec0: 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  sidered..  **.  
0ed0: 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f 6e 20 6c  ** In function l
0ee0: 6f 63 6b 54 61 62 6c 65 28 29 2c 20 69 66 20 61  ockTable(), if a
0ef0: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 64 65   read-lock is de
0f00: 6d 61 6e 64 65 64 20 61 6e 64 20 74 68 65 20 0a  manded and the .
0f10: 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f 6d 6d 69    ** ReadUncommi
0f20: 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  tted flag is set
0f30: 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73 20 61 64  , no entry is ad
0f40: 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 63 6b 73  ded to the locks
0f50: 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28 42 74 53   list .  ** (BtS
0f60: 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e 0a 20 20  hared.pLock)..  
0f70: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75 6d 6d 61  **.  ** To summa
0f80: 72 69 7a 65 3a 20 49 66 20 74 68 65 20 52 65 61  rize: If the Rea
0f90: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
0fa0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72  g is set, then r
0fb0: 65 61 64 20 63 75 72 73 6f 72 73 20 64 6f 0a 20  ead cursors do. 
0fc0: 20 2a 2a 20 6e 6f 74 20 63 72 65 61 74 65 20 6f   ** not create o
0fd0: 72 20 72 65 73 70 65 63 74 20 74 61 62 6c 65 20  r respect table 
0fe0: 6c 6f 63 6b 73 2e 20 54 68 65 20 6c 6f 63 6b 69  locks. The locki
0ff0: 6e 67 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72  ng procedure for
1000: 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 63   a .  ** write-c
1010: 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f 74 20 63  ursor does not c
1020: 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
1030: 28 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e 64 62  ( .    0==(p->db
1040: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
1050: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20  eadUncommitted) 
1060: 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d 3d 57  || .    eLock==W
1070: 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20 20 20  RITE_LOCK ||.   
1080: 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f 52 4f   iTab==MASTER_RO
1090: 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  OT.  ){.    for(
10a0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
10b0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
10c0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
10d0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
10e0: 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74 65  Btree!=p && pIte
10f0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20  r->iTable==iTab 
1100: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
1110: 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f  Iter->eLock!=eLo
1120: 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52 45 41  ck || eLock!=REA
1130: 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20  D_LOCK) ){.     
1140: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1150: 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d  _LOCKED;.      }
1160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1170: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1180: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
1190: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
11a0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
11b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
11c0: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
11d0: 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  Add a lock on th
11e0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
11f0: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f  t-page iTable to
1200: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
1210: 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72  e used.** by Btr
1220: 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72  ee handle p. Par
1230: 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73  ameter eLock mus
1240: 74 20 62 65 20 65 69 74 68 65 72 20 52 45 41 44  t be either READ
1250: 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49  _LOCK or .** WRI
1260: 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53  TE_LOCK..**.** S
1270: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1280: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
1290: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
12a0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42  sfully. SQLITE_B
12b0: 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  USY and.** SQLIT
12c0: 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f  E_NOMEM may also
12d0: 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   be returned..*/
12e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
12f0: 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
1300: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
1310: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
1320: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1330: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
1340: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
1350: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
1360: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1370: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1380: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
1390: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
13a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
13b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
13c0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54  db!=0 );..  /* T
13d0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
13e0: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
13f0: 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  he is not enable
1400: 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73  d */.  if( !p->s
1410: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72  harable ){.    r
1420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1430: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1440: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
1450: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
1460: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
1470: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64    /* If the read
1480: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  -uncommitted fla
1490: 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20 72  g is set and a r
14a0: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75  ead-lock is requ
14b0: 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75  ested,.  ** retu
14c0: 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74  rn early without
14d0: 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79   adding an entry
14e0: 20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64   to the BtShared
14f0: 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65  .pLock list. See
1500: 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e  .  ** comment in
1510: 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 54   function queryT
1520: 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d  ableLock() for m
1530: 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64  ore info on hand
1540: 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 52  ling .  ** the R
1550: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
1560: 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lag..  */.  if( 
1570: 0a 20 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61  .    (p->db->fla
1580: 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
1590: 63 6f 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20  committed) && . 
15a0: 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f     (eLock==READ_
15b0: 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61  LOCK) &&.    iTa
15c0: 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54  ble!=MASTER_ROOT
15d0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
15e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
15f0: 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72  .  /* First sear
1600: 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20  ch the list for 
1610: 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b  an existing lock
1620: 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20   on this table. 
1630: 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  */.  for(pIter=p
1640: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1650: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1660: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1670: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
1680: 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70  able && pIter->p
1690: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
16a0: 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b    pLock = pIter;
16b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
16d0: 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63   the above searc
16e0: 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61  h did not find a
16f0: 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61   BtLock struct a
1700: 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65  ssociating Btree
1710: 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62   p.  ** with tab
1720: 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63  le iTable, alloc
1730: 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b  ate one and link
1740: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73   it into the lis
1750: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  t..  */.  if( !p
1760: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
1770: 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71  k = (BtLock *)sq
1780: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1790: 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b  sizeof(BtLock));
17a0: 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  .    if( !pLock 
17b0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17d0: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69    }.    pLock->i
17e0: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
17f0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65      pLock->pBtre
1800: 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b  e = p;.    pLock
1810: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
1820: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
1830: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
1840: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1850: 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72  BtLock.eLock var
1860: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78  iable to the max
1870: 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72  imum of the curr
1880: 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e  ent lock.  ** an
1890: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
18a0: 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73  lock. This means
18b0: 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b   if a write-lock
18c0: 20 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c   was already hel
18d0: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61  d.  ** and a rea
18e0: 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64  d-lock requested
18f0: 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72  , we don't incor
1900: 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65  rectly downgrade
1910: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   the lock..  */.
1920: 20 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f    assert( WRITE_
1930: 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29  LOCK>READ_LOCK )
1940: 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c  ;.  if( eLock>pL
1950: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock->eLock ){.  
1960: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
1970: 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72   eLock;.  }..  r
1980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1990: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
19a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
19b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
19c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
19d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
19e0: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  * Release all th
19f0: 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c  e table locks (l
1a00: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69  ocks obtained vi
1a10: 61 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 6c  a calls to the l
1a20: 6f 63 6b 54 61 62 6c 65 28 29 0a 2a 2a 20 70 72  ockTable().** pr
1a30: 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62 79  ocedure) held by
1a40: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
1a50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a60: 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
1a70: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
1a80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a90: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
1aa0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
1ab0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
1ac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1ad0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1ae0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
1af0: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
1b00: 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  r );..  while( *
1b10: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
1b20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
1b30: 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72  pIter;.    asser
1b40: 74 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  t( pBt->pExclusi
1b50: 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 45  ve==0 || pBt->pE
1b60: 78 63 6c 75 73 69 76 65 3d 3d 70 4c 6f 63 6b 2d  xclusive==pLock-
1b70: 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 69  >pBtree );.    i
1b80: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
1b90: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
1ba0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
1bb0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1bc0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
1bd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1be0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
1bf0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1c00: 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
1c10: 45 78 63 6c 75 73 69 76 65 3d 3d 70 20 29 7b 0a  Exclusive==p ){.
1c20: 20 20 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73      pBt->pExclus
1c30: 69 76 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  ive = 0;.  }.}.#
1c40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1c50: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1c60: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
1c70: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
1c80: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
1c90: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1ca0: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56  ence */../*.** V
1cb0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
1cc0: 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75  ursor holds a mu
1cd0: 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
1ce0: 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  red.*/.#ifndef N
1cf0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
1d00: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1d10: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
1d20: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1d30: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
1d40: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  Bt->mutex);.}.#e
1d50: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
1d60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1d70: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  LOB./*.** Invali
1d80: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
1d90: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1da0: 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75  e for cursor pCu
1db0: 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74  r, if any..*/.st
1dc0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
1dd0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1de0: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1df0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1e00: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1e10: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
1e20: 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
1e30: 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e  rflow);.  pCur->
1e40: 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d  aOverflow = 0;.}
1e50: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
1e60: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
1e70: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1e80: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
1e90: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
1ea0: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
1eb0: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
1ec0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
1ed0: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1ee0: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
1ef0: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
1f00: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
1f10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1f20: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1f30: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
1f40: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1f50: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61  pNext){.    inva
1f60: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
1f70: 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  che(p);.  }.}.#e
1f80: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  lse.  #define in
1f90: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1fa0: 43 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69  Cache(x).  #defi
1fb0: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  ne invalidateAll
1fc0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29  OverflowCache(x)
1fd0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1fe0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
1ff0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
2000: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
2010: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
2020: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
2030: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
2040: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
2050: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
2060: 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  ESEEK..*/.static
2070: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50   int saveCursorP
2080: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
2090: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
20a0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55  c;..  assert( CU
20b0: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
20c0: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
20d0: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
20e0: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
20f0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2100: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63  x(pCur) );..  rc
2110: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
2120: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43  eySize(pCur, &pC
2130: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a  ur->nKey);..  /*
2140: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
2150: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
2160: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
2170: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
2180: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
2190: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
21a0: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
21b0: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
21c0: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
21d0: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
21e0: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
21f0: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
2200: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
2210: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
2220: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
2230: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
2240: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
2250: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
2260: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ta..  */.  if( r
2270: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2280: 30 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  0==pCur->pPage->
2290: 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69  intKey){.    voi
22a0: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
22b0: 33 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b  3Malloc(pCur->nK
22c0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ey);.    if( pKe
22d0: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
22e0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
22f0: 70 43 75 72 2c 20 30 2c 20 70 43 75 72 2d 3e 6e  pCur, 0, pCur->n
2300: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
2310: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2320: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2330: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
2340: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2350: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2360: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
2370: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2380: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2390: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
23a0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
23b0: 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
23c0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
23d0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
23e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
23f0: 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
2400: 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72  pPage);.    pCur
2410: 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->pPage = 0;.   
2420: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2430: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2440: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
2450: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
2460: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
2470: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2480: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
2490: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
24a0: 73 20 65 78 63 65 70 74 20 70 45 78 63 65 70 74  s except pExcept
24b0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61 62   open on the tab
24c0: 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74  le .** with root
24d0: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75  -page iRoot. Usu
24e0: 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61  ally, this is ca
24f0: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
2500: 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65   cursor.** pExce
2510: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f  pt is used to mo
2520: 64 69 66 79 20 74 68 65 20 74 61 62 6c 65 20 28  dify the table (
2530: 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72  BtreeDelete() or
2540: 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 29 2e   BtreeInsert()).
2550: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2560: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  aveAllCursors(Bt
2570: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
2580: 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  o iRoot, BtCurso
2590: 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42  r *pExcept){.  B
25a0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
25b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25c0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
25d0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
25e0: 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20  ( pExcept==0 || 
25f0: 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42  pExcept->pBt==pB
2600: 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  t );.  for(p=pBt
2610: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
2620: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
2630: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
2640: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
2650: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
2660: 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 2d  ) && .        p-
2670: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2680: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 69  VALID ){.      i
2690: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
26a0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
26b0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
26c0: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
26d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
26e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
26f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2700: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
2710: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  r the current cu
2720: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
2730: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
2740: 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2750: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
2760: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2770: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2780: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
2790: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
27a0: 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  );.  pCur->pKey 
27b0: 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  = 0;.  pCur->eSt
27c0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
27d0: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
27e0: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
27f0: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
2800: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
2810: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
2820: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
2830: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2840: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
2850: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
2860: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
2870: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
2880: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
2890: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
28a0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
28b0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
28c0: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
28d0: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
28e0: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
28f0: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
2900: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
2910: 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n()..*/.int sqli
2920: 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43  te3BtreeRestoreC
2930: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
2940: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2950: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
2960: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2970: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2980: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2990: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
29a0: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
29b0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29c0: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
29d0: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
29e0: 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70 43 75 72  skip;.  }.  pCur
29f0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2a00: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
2a10: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
2a20: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
2a30: 3e 70 4b 65 79 2c 20 30 2c 20 70 43 75 72 2d 3e  >pKey, 0, pCur->
2a40: 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e  nKey, 0, &pCur->
2a50: 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d  skip);.  if( rc=
2a60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2a80: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
2a90: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
2aa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ab0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ac0: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2ad0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
2ae0: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
2af0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
2b00: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
2b10: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
2b20: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
2b30: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2b40: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73  K ? \.         s
2b50: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
2b60: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2b70: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
2b80: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
2b90: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
2ba0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
2bb0: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
2bc0: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
2bd0: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
2be0: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
2bf0: 6f 72 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e  or can move when
2c00: 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72   the row they ar
2c10: 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74  e pointing.** at
2c20: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20   is deleted out 
2c30: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e  from under them.
2c40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2c50: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ine returns an e
2c60: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d  rror code if som
2c70: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
2c80: 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67  g.  The.** integ
2c90: 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73  er *pHasMoved is
2ca0: 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74   set to one if t
2cb0: 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f  he cursor has mo
2cc0: 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74  ved and 0 if not
2cd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ce0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
2cf0: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
2d00: 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76  ur, int *pHasMov
2d10: 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ed){.  int rc;..
2d20: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2d30: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2d40: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
2d50: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
2d60: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
2d70: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
2d80: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d90: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2da0: 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20  >skip!=0 ){.    
2db0: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a  *pHasMoved = 1;.
2dc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48    }else{.    *pH
2dd0: 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d  asMoved = 0;.  }
2de0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2df0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
2e00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2e10: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
2e20: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
2e30: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
2e40: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
2e50: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
2e60: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
2e70: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
2e80: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2e90: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
2ea0: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
2eb0: 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mber..*/.static 
2ec0: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
2ed0: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
2ee0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
2ef0: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
2f00: 61 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72 65  age, iPtrMap, re
2f10: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2f20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2f30: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2f40: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
2f50: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
2f60: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
2f70: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
2f80: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
2f90: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
2fa0: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
2fb0: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
2fc0: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
2fd0: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2fe0: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
2ff0: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
3000: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
3010: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
3020: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
3030: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
3040: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
3050: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
3060: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
3070: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
3080: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
3090: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
30a0: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
30b0: 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  o'..** An error 
30c0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
30d0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
30e0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
30f0: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
3100: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
3110: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
3120: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
3130: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
3140: 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65  arent){.  DbPage
3150: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
3160: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
3170: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
3180: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
3190: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
31a0: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
31b0: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
31c0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
31d0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
31e0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
31f0: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
3200: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
3210: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
3220: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3230: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
3240: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
3250: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
3260: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
3270: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
3280: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
3290: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
32a0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
32b0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
32c0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
32d0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
32e0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
32f0: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
3300: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3310: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
3320: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
3330: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
3340: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
3350: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
3360: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
3370: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
3380: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3390: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
33a0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66  urn rc;.  }.  of
33b0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
33c0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
33d0: 20 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70   key);.  pPtrmap
33e0: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
33f0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
3400: 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54  Page);..  if( eT
3410: 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66  ype!=pPtrmap[off
3420: 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65  set] || get4byte
3430: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
3440: 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a  +1])!=parent ){.
3450: 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d      TRACE(("PTRM
3460: 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28  AP_UPDATE: %d->(
3470: 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20  %d,%d)\n", key, 
3480: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b  eType, parent));
3490: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34a0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
34b0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
34c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
34d0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
34e0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
34f0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
3500: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
3510: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
3520: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61    }..  sqlite3Pa
3530: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
3540: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
3550: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
3560: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
3570: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
3580: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3590: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
35a0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
35b0: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
35c0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
35d0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
35e0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
35f0: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
3600: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
3610: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
3620: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
3630: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
3640: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
3650: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
3660: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
3670: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
3680: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
3690: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
36a0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
36b0: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
36c0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
36d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
36e0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
36f0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
3700: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
3710: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
3720: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3730: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
3740: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
3750: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
3760: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
3770: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
3780: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3790: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
37a0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
37b0: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
37c0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
37d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37e0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
37f0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
3800: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
3810: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3820: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
3830: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
3840: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
3850: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
3860: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
3870: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
3880: 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ey);.  assert( p
3890: 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70  EType!=0 );.  *p
38a0: 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b  EType = pPtrmap[
38b0: 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70  offset];.  if( p
38c0: 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20  Pgno ) *pPgno = 
38d0: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
38e0: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20  p[offset+1]);.. 
38f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
3900: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ef(pDbPage);.  i
3910: 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20  f( *pEType<1 || 
3920: 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75  *pEType>5 ) retu
3930: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
3940: 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e  T_BKPT;.  return
3950: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
3960: 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e  else /* if defin
3970: 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed SQLITE_OMIT_A
3980: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23  UTOVACUUM */.  #
3990: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
39a0: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
39b0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
39c0: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
39d0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
39e0: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
39f0: 66 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  fl(y,z) SQLITE_O
3a00: 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
3a10: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
3a20: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
3a30: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
3a40: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
3a50: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
3a60: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
3a70: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
3a80: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
3a90: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
3aa0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
3ab0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
3ac0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
3ad0: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
3ae0: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
3af0: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
3b00: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
3b10: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
3b20: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
3b30: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
3b40: 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65  )->aData[(P)->ce
3b50: 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29  llOffset+2*(I)])
3b60: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ))../*.** This a
3b70: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
3b80: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
3b90: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
3ba0: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
3bb0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
3bc0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65  flow cells.  See
3bd0: 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69   insert.*/.stati
3be0: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
3bf0: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
3c00: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
3c10: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
3c20: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3c30: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
3c40: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3c50: 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f   for(i=pPage->nO
3c60: 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b  verflow-1; i>=0;
3c70: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b   i--){.    int k
3c80: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76  ;.    struct _Ov
3c90: 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20  flCell *pOvfl;. 
3ca0: 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67     pOvfl = &pPag
3cb0: 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  e->aOvfl[i];.   
3cc0: 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b   k = pOvfl->idx;
3cd0: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
3ce0: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
3cf0: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
3d00: 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d     return pOvfl-
3d10: 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pCell;.      }.
3d20: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
3d30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3d40: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
3d50: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
3d60: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
3d70: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
3d80: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
3d90: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
3da0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
3db0: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
3dc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
3dd0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
3de0: 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20  eCell() takes a 
3df0: 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61  .** cell index a
3e00: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
3e10: 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65  ument and sqlite
3e20: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
3e30: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
3e40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3e50: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
3e60: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
3e70: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  rgument..**.** W
3e80: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c  ithin this file,
3e90: 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29   the parseCell()
3ea0: 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61   macro can be ca
3eb0: 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  lled instead of.
3ec0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
3ed0: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
3ee0: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
3ef0: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
3f00: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69  e faster..*/.voi
3f10: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
3f20: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
3f30: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
3f40: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
3f50: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
3f60: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
3f70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3f80: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
3f90: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
3fa0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
3fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
3fc0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
3fd0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
3fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3ff0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
4000: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
4010: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
4020: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
4030: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4040: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
4050: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
4060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
4070: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
4080: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
4090: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
40a0: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
40b0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
40c0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
40d0: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
40e0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
40f0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
4100: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
4110: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
4120: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66  intKey ){.    if
4130: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
4140: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67   ){.      n += g
4150: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
4160: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
4170: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4180: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a    nPayload = 0;.
4190: 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67      }.    n += g
41a0: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
41b0: 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  n], (u64*)&pInfo
41c0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e  ->nKey);.    pIn
41d0: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
41e0: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
41f0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
4200: 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  = 0;.    n += ge
4210: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
4220: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
4230: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
4240: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a  = nPayload;.  }.
4250: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
4260: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
4270: 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d  pInfo->nHeader =
4280: 20 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79   n;.  if( likely
4290: 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65  (nPayload<=pPage
42a0: 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20  ->maxLocal) ){. 
42b0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
42c0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
42d0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
42e0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
42f0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
4300: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
4310: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
4320: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
4330: 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
4340: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
4350: 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  ize of cell cont
4360: 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ent in bytes */.
4370: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79      nSize = nPay
4380: 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49  load + n;.    pI
4390: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50  nfo->nLocal = nP
43a0: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66  ayload;.    pInf
43b0: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30  o->iOverflow = 0
43c0: 3b 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65  ;.    if( (nSize
43d0: 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20   & ~3)==0 ){.   
43e0: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20     nSize = 4;   
43f0: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
4400: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
4410: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66  /.    }.    pInf
4420: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65  o->nSize = nSize
4430: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
4440: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
4450: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
4460: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
4470: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
4480: 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65  ave.    ** to de
4490: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
44a0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
44b0: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
44c0: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a  pill onto.    **
44d0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
44e0: 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69    The strategy i
44f0: 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  s to minimize th
4500: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73  e amount of unus
4510: 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  ed.    ** space 
4520: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
4530: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
4540: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
4550: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20  cal storage.    
4560: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
4570: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
4580: 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cal..    **.    
4590: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
45a0: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
45b0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
45c0: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
45d0: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20   any.    ** way 
45e0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
45f0: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
4600: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20  ile format..    
4610: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  */.    int minLo
4620: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
4630: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
4640: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
4650: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f  */.    int maxLo
4660: 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  cal;  /* Maximum
4670: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
4680: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
4690: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c  */.    int surpl
46a0: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
46b0: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
46c0: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
46d0: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69  orage */..    mi
46e0: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
46f0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61  minLocal;.    ma
4700: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
4710: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75  maxLocal;.    su
4720: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
4730: 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
4740: 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d  inLocal)%(pPage-
4750: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
4760: 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73   - 4);.    if( s
4770: 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63  urplus <= maxLoc
4780: 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  al ){.      pInf
4790: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70  o->nLocal = surp
47a0: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
47b0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
47c0: 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  cal = minLocal;.
47d0: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
47e0: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e  >iOverflow = pIn
47f0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a  fo->nLocal + n;.
4800: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
4810: 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66   = pInfo->iOverf
4820: 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23  low + 4;.  }.}.#
4830: 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c  define parseCell
4840: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
4850: 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74 65  Info) \.  sqlite
4860: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
4870: 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64  tr((pPage), find
4880: 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69  Cell((pPage), (i
4890: 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29  Cell)), (pInfo))
48a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
48b0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
48c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
48d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
48e0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
48f0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
4900: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
4910: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
4920: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
4930: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
4940: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
4950: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
4960: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
4970: 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  .  parseCell(pPa
4980: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
4990: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  );.}../*.** Comp
49a0: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ute the total nu
49b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
49c0: 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20  at a Cell needs 
49d0: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  in the cell.** d
49e0: 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20  ata area of the 
49f0: 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65  btree-page.  The
4a00: 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69   return number i
4a10: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c  ncludes the cell
4a20: 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20  .** data header 
4a30: 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61  and the local pa
4a40: 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61  yload, but not a
4a50: 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
4a60: 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65   or.** the space
4a70: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c   used by the cel
4a80: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69  l pointer..*/.#i
4a90: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
4aa0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
4ab0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
4ac0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 43   int iCell){.  C
4ad0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
4ae0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
4af0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
4b00: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65  ll, &info);.  re
4b10: 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  turn info.nSize;
4b20: 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  .}.#endif.static
4b30: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
4b40: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
4b50: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43   u8 *pCell){.  C
4b60: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
4b70: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
4b80: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
4b90: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
4ba0: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
4bb0: 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ze;.}..#ifndef S
4bc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
4bd0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
4be0: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
4bf0: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
4c00: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
4c10: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
4c20: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
4c30: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
4c40: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
4c50: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
4c60: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
4c70: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
4c80: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
4c90: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
4ca0: 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  Cell){.  CellInf
4cb0: 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74  o info;.  assert
4cc0: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
4cd0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
4ce0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
4cf0: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
4d00: 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e   assert( (info.n
4d10: 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
4d20: 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
4d30: 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  )==info.nPayload
4d40: 20 29 3b 0a 20 20 69 66 28 20 28 69 6e 66 6f 2e   );.  if( (info.
4d50: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
4d60: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
4d70: 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
4d80: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
4d90: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
4da0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
4db0: 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ]);.    return p
4dc0: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
4dd0: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
4de0: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
4df0: 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ge->pgno);.  }. 
4e00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4e10: 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  K;.}./*.** If th
4e20: 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64 65  e cell with inde
4e30: 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65 20  x iCell on page 
4e40: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
4e50: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
4e60: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
4e70: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
4e80: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
4e90: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
4ea0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
4eb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
4ec0: 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d 50  rmapPutOvfl(MemP
4ed0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
4ee0: 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 43  iCell){.  u8 *pC
4ef0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ell;.  assert( s
4f00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
4f10: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
4f20: 74 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c 20  tex) );.  pCell 
4f30: 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  = findOverflowCe
4f40: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
4f50: 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61  ;.  return ptrma
4f60: 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
4f70: 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e  e, pCell);.}.#en
4f80: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
4f90: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
4fa0: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
4fb0: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
4fc0: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
4fd0: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
4fe0: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
4ff0: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
5000: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
5010: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
5020: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
5030: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
5040: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
5050: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
5060: 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rea..*/.static v
5070: 6f 69 64 20 64 65 66 72 61 67 6d 65 6e 74 50 61  oid defragmentPa
5080: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
5090: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
50c0: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
50f0: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
5100: 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20  int addr;       
5110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
5120: 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62 79  fset of first by
5130: 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f  te after cell po
5140: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
5150: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
5160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5170: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
5180: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
5190: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
51a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
51b0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
51c0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
51d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
51e0: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
51f0: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
5200: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
5210: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
5220: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
5230: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
5240: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b  ay */.  int brk;
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
5270: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
5280: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
5290: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
52a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
52b0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
52c0: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
52d0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
52e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
52f0: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
5300: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
5310: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
5320: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
5330: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
5340: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
5350: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
5360: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
5370: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
5380: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
5390: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
53a0: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
53b0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
53c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
53d0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
53e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
53f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5400: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
5410: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
5420: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
5430: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
5440: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
5450: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
5460: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
5470: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
5480: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
5490: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
54a0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
54b0: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
54c0: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
54d0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
54e0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
54f0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
5500: 62 6c 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d  bleSize;.  brk =
5510: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5520: 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  hdr+5]);.  memcp
5530: 79 28 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64  y(&temp[brk], &d
5540: 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65  ata[brk], usable
5550: 53 69 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62  Size - brk);.  b
5560: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
5570: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
5580: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
5590: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
55a0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
55b0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
55c0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
55d0: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
55e0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
55f0: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73  (pAddr);.    ass
5600: 65 72 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70  ert( pc<pPage->p
5610: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
5620: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  ;.    size = cel
5630: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
5640: 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20  &temp[pc]);.    
5650: 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20  brk -= size;.   
5660: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72   memcpy(&data[br
5670: 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73  k], &temp[pc], s
5680: 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ize);.    put2by
5690: 74 65 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a  te(pAddr, brk);.
56a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72    }.  assert( br
56b0: 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  k>=cellOffset+2*
56c0: 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62  nCell );.  put2b
56d0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
56e0: 2c 20 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68  , brk);.  data[h
56f0: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
5700: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
5710: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
5720: 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66  .  addr = cellOf
5730: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20  fset+2*nCell;.  
5740: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64  memset(&data[add
5750: 72 5d 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29  r], 0, brk-addr)
5760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
5770: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
5780: 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20 70 61  of space on a pa
5790: 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ge..**.** Return
57a0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
57b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f  pPage->aData[] o
57c0: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
57d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61   of.** the new a
57e0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 65 20  llocation.  The 
57f0: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
5800: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
5810: 65 6e 6f 75 67 68 0a 2a 2a 20 73 70 61 63 65 2e  enough.** space.
5820: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
5830: 69 6c 6c 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a  ill never fail..
5840: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
5850: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65  e contains nByte
5860: 73 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 20  s of free space 
5870: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  but does not con
5880: 74 61 69 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  tain.** nBytes o
5890: 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 66 72 65  f contiguous fre
58a0: 65 20 73 70 61 63 65 2c 20 74 68 65 6e 20 74 68  e space, then th
58b0: 69 73 20 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d  is routine autom
58c0: 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c  atically.** call
58d0: 73 20 64 65 66 72 61 67 65 6d 65 6e 74 50 61 67  s defragementPag
58e0: 65 28 29 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61  e() to consolida
58f0: 74 65 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  te all free spac
5900: 65 20 62 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c  e before .** all
5910: 6f 63 61 74 69 6e 67 20 74 68 65 20 6e 65 77 20  ocating the new 
5920: 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  chunk..*/.static
5930: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
5940: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
5950: 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  e, int nByte){. 
5960: 20 69 6e 74 20 61 64 64 72 2c 20 70 63 2c 20 68   int addr, pc, h
5970: 64 72 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a  dr;.  int size;.
5980: 20 20 69 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69    int nFrag;.  i
5990: 6e 74 20 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43  nt top;.  int nC
59a0: 65 6c 6c 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  ell;.  int cellO
59b0: 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ffset;.  unsigne
59c0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
59d0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
59e0: 3e 61 44 61 74 61 3b 0a 20 20 61 73 73 65 72 74  >aData;.  assert
59f0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
5a00: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
5a10: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
5a20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
5a30: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
5a40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5a50: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
5a60: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
5a70: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
5a80: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
5a90: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
5aa0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
5ab0: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
5ac0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
5ad0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
5ae0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
5af0: 6e 42 79 74 65 3b 0a 20 20 68 64 72 20 3d 20 70  nByte;.  hdr = p
5b00: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
5b10: 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61  ..  nFrag = data
5b20: 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e  [hdr+7];.  if( n
5b30: 46 72 61 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f  Frag<60 ){.    /
5b40: 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65  * Search the fre
5b50: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
5b60: 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  r a slot big eno
5b70: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
5b80: 68 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  he.    ** space 
5b90: 72 65 71 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20  request. */.    
5ba0: 61 64 64 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20  addr = hdr+1;.  
5bb0: 20 20 77 68 69 6c 65 28 20 28 70 63 20 3d 20 67    while( (pc = g
5bc0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
5bd0: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 20  dr]))>0 ){.     
5be0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
5bf0: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
5c00: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e       if( size>=n
5c10: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
5c20: 69 66 28 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34  if( size<nByte+4
5c30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
5c40: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
5c50: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
5c60: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
5c70: 68 64 72 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b  hdr+7] = nFrag +
5c80: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
5c90: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
5ca0: 70 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pc;.        }els
5cb0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  e{.          put
5cc0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
5cd0: 5d 2c 20 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a  ], size-nByte);.
5ce0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5cf0: 20 70 63 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79   pc + size - nBy
5d00: 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  te;.        }.  
5d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72      }.      addr
5d20: 20 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d   = pc;.    }.  }
5d30: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
5d40: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
5d50: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
5d60: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
5d70: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
5d80: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
5d90: 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  area..  */.  top
5da0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5db0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65  a[hdr+5]);.  nCe
5dc0: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
5dd0: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63  ata[hdr+3]);.  c
5de0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
5df0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
5e00: 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c   if( nFrag>=60 |
5e10: 7c 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  | cellOffset + 2
5e20: 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e  *nCell > top - n
5e30: 42 79 74 65 20 29 7b 0a 20 20 20 20 64 65 66 72  Byte ){.    defr
5e40: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
5e50: 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  );.    top = get
5e60: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
5e70: 35 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d  5]);.  }.  top -
5e80: 3d 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72  = nByte;.  asser
5e90: 74 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  t( cellOffset + 
5ea0: 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29  2*nCell <= top )
5eb0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
5ec0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
5ed0: 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a 7d  .  return top;.}
5ee0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
5ef0: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
5f00: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
5f10: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
5f20: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
5f30: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
5f40: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
5f50: 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20  aDisk[start].** 
5f60: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
5f70: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69  the block is "si
5f80: 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ze" bytes..**.**
5f90: 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66   Most of the eff
5fa0: 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f  ort here is invo
5fb0: 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e  lved in coalesin
5fc0: 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72  g adjacent.** fr
5fd0: 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61  ee blocks into a
5fe0: 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65   single big free
5ff0: 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   block..*/.stati
6000: 63 20 76 6f 69 64 20 66 72 65 65 53 70 61 63 65  c void freeSpace
6010: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
6020: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
6030: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
6040: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
6050: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6060: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
6070: 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
6080: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
6090: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
60a0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
60b0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
60c0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
60d0: 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68   start>=pPage->h
60e0: 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67  drOffset+6+(pPag
60f0: 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a  e->leaf?0:4) );.
6100: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
6110: 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d   + size)<=pPage-
6120: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6130: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
6140: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6150: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
6160: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
6170: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
6180: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
6190: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64  ze is 4 */..#ifd
61a0: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
61b0: 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65  _DELETE.  /* Ove
61c0: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
61d0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
61e0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53  zeros when the S
61f0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20  ECURE_DELETE .  
6200: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
6210: 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
6220: 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  time */.  memset
6230: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
6240: 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  , size);.#endif.
6250: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
6260: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
6270: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
6280: 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20   freeblocks */. 
6290: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
62a0: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
62b0: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
62c0: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
62d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
62e0: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
62f0: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  egin>0 ){.    as
6300: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
6310: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
6320: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61 73  Size-4 );.    as
6330: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
6340: 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  r );.    addr = 
6350: 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61 73  pbegin;.  }.  as
6360: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
6370: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
6380: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73 65  Size-4 );.  asse
6390: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
63a0: 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a  || pbegin==0 );.
63b0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
63c0: 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a  [addr], start);.
63d0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
63e0: 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29  [start], pbegin)
63f0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
6400: 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a  ta[start+2], siz
6410: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
6420: 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f  ee += size;..  /
6430: 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63  * Coalesce adjac
6440: 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  ent free blocks 
6450: 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67  */.  addr = pPag
6460: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31  e->hdrOffset + 1
6470: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
6480: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
6490: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
64a0: 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20  .    int pnext, 
64b0: 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  psize;.    asser
64c0: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
64d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
64e0: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
64f0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
6500: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
6510: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
6520: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
6530: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
6540: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
6550: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
6560: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
6570: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
6580: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
6590: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
65a0: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 61  +psize);.      a
65b0: 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61 74  ssert( frag<=dat
65c0: 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
65d0: 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20 64  et+7] );.      d
65e0: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
65f0: 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67 3b  fset+7] -= frag;
6600: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
6610: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 67  &data[pbegin], g
6620: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
6630: 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70 75  ext]));.      pu
6640: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
6650: 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67 65  gin+2], pnext+ge
6660: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65  t2byte(&data[pne
6670: 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b 0a  xt+2])-pbegin);.
6680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6690: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
66a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
66b0: 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
66c0: 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20  ent area begins 
66d0: 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b  with a freeblock
66e0: 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a  , remove it. */.
66f0: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31    if( data[hdr+1
6700: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26  ]==data[hdr+5] &
6710: 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64  & data[hdr+2]==d
6720: 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20  ata[hdr+6] ){.  
6730: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70    int top;.    p
6740: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
6750: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
6760: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
6770: 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70  [hdr+1], &data[p
6780: 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20  begin], 2);.    
6790: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
67a0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
67b0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
67c0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20 67  [hdr+5], top + g
67d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
67e0: 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d  egin+2]));.  }.}
67f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
6800: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
6810: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
6820: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
6830: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
6840: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
6850: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
6860: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
6870: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
6880: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
6890: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
68a0: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
68b0: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
68c0: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
68d0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
68e0: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
68f0: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
6900: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
6910: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
6920: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
6930: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
6940: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
6950: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
6960: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
6970: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
6980: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
6990: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
69a0: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
69b0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
69c0: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
69d0: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
69e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
69f0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
6a00: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
6a10: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
6a20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6a30: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6a40: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6a50: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
6a60: 20 66 6c 61 67 42 79 74 65 3e 3e 33 3b 20 20 61   flagByte>>3;  a
6a70: 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20  ssert( PTF_LEAF 
6a80: 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61  == 1<<3 );.  fla
6a90: 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45  gByte &= ~PTF_LE
6aa0: 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  AF;.  pPage->chi
6ab0: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a  ldPtrSize = 4-4*
6ac0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70  pPage->leaf;.  p
6ad0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
6ae0: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
6af0: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
6b00: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
6b10: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
6b20: 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  y = 1;.    pPage
6b30: 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67  ->hasData = pPag
6b40: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61  e->leaf;.    pPa
6b50: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
6b60: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
6b70: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
6b80: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
6b90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
6ba0: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
6bb0: 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ATA ){.    pPage
6bc0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
6bd0: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
6be0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
6bf0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
6c00: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
6c10: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
6c20: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
6c30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
6c40: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
6c50: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
6c60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6c70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
6c80: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
6c90: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
6ca0: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
6cb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72 65  .**.** The pPare
6cc0: 6e 74 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73  nt parameter mus
6cd0: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
6ce0: 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 77 68  o the MemPage wh
6cf0: 69 63 68 0a 2a 2a 20 69 73 20 74 68 65 20 70 61  ich.** is the pa
6d00: 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  rent of the page
6d10: 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a   being initializ
6d20: 65 64 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f 66  ed.  The root of
6d30: 20 61 0a 2a 2a 20 42 54 72 65 65 20 68 61 73 20   a.** BTree has 
6d40: 6e 6f 20 70 61 72 65 6e 74 20 61 6e 64 20 73 6f  no parent and so
6d50: 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2c 20   for that page, 
6d60: 70 50 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a 2a  pParent==NULL..*
6d70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
6d80: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
6d90: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
6da0: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
6db0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
6dc0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
6dd0: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
6de0: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
6df0: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
6e00: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
6e10: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
6e20: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
6e30: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
6e40: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
6e50: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
6e60: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
6e70: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
6e80: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69  corruption..*/.i
6e90: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
6ea0: 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  nitPage(.  MemPa
6eb0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
6ec0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
6ed0: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
6ee0: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
6ef0: 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 54  arent       /* T
6f00: 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69 67 68  he parent.  Migh
6f10: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
6f20: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
6f30: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6f40: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
6f50: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
6f60: 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68 64  ta[] */.  int hd
6f70: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
6f80: 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e  Offset to beginn
6f90: 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64  ing of page head
6fa0: 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  er */.  u8 *data
6fb0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
6fc0: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
6fd0: 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ata */.  BtShare
6fe0: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
6ff0: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
7000: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7010: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
7020: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
7030: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
7040: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  each page */.  i
7050: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
7060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
7070: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
7080: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
7090: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  nter */.  int nF
70a0: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
70b0: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
70c0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
70d0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ge */.  int top;
70e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
70f0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
7100: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
7110: 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  a */..  pBt = pP
7120: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
7130: 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20 20  rt( pBt!=0 );.  
7140: 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d  assert( pParent=
7150: 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 70  =0 || pParent->p
7160: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73 73  Bt==pBt );.  ass
7170: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7180: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7190: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
71a0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
71b0: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
71c0: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
71d0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
71e0: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
71f0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
7200: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
7210: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
7220: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
7230: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7240: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7250: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
7260: 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65 6e  >pParent!=pParen
7270: 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50 61  t && (pPage->pPa
7280: 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67 65  rent!=0 || pPage
7290: 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20 20  ->isInit) ){.   
72a0: 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 70   /* The parent p
72b0: 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72  age should never
72c0: 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20 74   change unless t
72d0: 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  he file is corru
72e0: 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  pt */.    return
72f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7300: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
7310: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 20  pPage->isInit ) 
7320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7330: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ;.  if( pPage->p
7340: 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50 61  Parent==0 && pPa
7350: 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 70  rent!=0 ){.    p
7360: 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20  Page->pParent = 
7370: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
7380: 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
7390: 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
73a0: 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61 67    }.  hdr = pPag
73b0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
73c0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
73d0: 61 74 61 3b 0a 20 20 69 66 28 20 64 65 63 6f 64  ata;.  if( decod
73e0: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
73f0: 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72  ta[hdr]) ) retur
7400: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7410: 5f 42 4b 50 54 3b 0a 20 20 61 73 73 65 72 74 28  _BKPT;.  assert(
7420: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
7430: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
7440: 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20  Size<=32768 );. 
7450: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
7460: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
7470: 20 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e   - 1;.  pPage->n
7480: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
7490: 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20  pPage->idxShift 
74a0: 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
74b0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
74c0: 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
74d0: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
74e0: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
74f0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
7500: 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  ;.  top = get2by
7510: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
7520: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
7530: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
7540: 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28  a[hdr+3]);.  if(
7550: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
7560: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
7570: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
7580: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
7590: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
75a0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
75b0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
75c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
75d0: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  T;.  }.  if( pPa
75e0: 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ge->nCell==0 && 
75f0: 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70 50  pParent!=0 && pP
7600: 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  arent->pgno!=1 )
7610: 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61 67  {.    /* All pag
7620: 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 74 20  es must have at 
7630: 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c 20  least one cell, 
7640: 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74 20  except for root 
7650: 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65 74  pages */.    ret
7660: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7670: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
7680: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
7690: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
76a0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
76b0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
76c0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
76d0: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
76e0: 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c  +7] + top - (cel
76f0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
7700: 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68 69  e->nCell);.  whi
7710: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
7720: 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  int next, size;.
7730: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
7740: 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20  eSize-4 ){.     
7750: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20 69   /* Free block i
7760: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
7770: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
7780: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7790: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 6e  PT; .    }.    n
77a0: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
77b0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 73  data[pc]);.    s
77c0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
77d0: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
77e0: 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e   if( next>0 && n
77f0: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
7800: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
7810: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
7820: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
7830: 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  r */.      retur
7840: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7850: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
7860: 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b    nFree += size;
7870: 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a  .    pc = next;.
7880: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
7890: 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69 66  ee = nFree;.  if
78a0: 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53  ( nFree>=usableS
78b0: 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46 72  ize ){.    /* Fr
78c0: 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20  ee space cannot 
78d0: 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67  exceed total pag
78e0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 65  e size */.    re
78f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7900: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a  UPT_BKPT; .  }..
7910: 23 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b  #if 0.  /* Check
7920: 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66   that all the of
7930: 66 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c  fsets in the cel
7940: 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61  l offset array a
7950: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
7960: 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69   .  ** .  ** Omi
7970: 74 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69  tting this consi
7980: 73 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64  stency check and
7990: 20 75 73 69 6e 67 20 74 68 65 20 70 50 61 67 65   using the pPage
79a0: 2d 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a  ->maskPage mask.
79b0: 20 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20    ** to prevent 
79c0: 6f 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20  overrunning the 
79d0: 70 61 67 65 20 62 75 66 66 65 72 20 69 6e 20 66  page buffer in f
79e0: 69 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74  indCell() result
79f0: 73 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25  s in a.  ** 2.5%
7a00: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69   performance gai
7a10: 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  n..  */.  {.    
7a20: 75 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20  u8 *pOff;       
7a30: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65   /* Iterator use
7a40: 64 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63  d to check all c
7a50: 65 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20  ell offsets are 
7a60: 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  in range */.    
7a70: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
7a80: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65   /* Pointer to e
7a90: 6e 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65  nd of cell offse
7aa0: 74 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75  t array */.    u
7ab0: 38 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  8 mask;         
7ac0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20  /* Mask of bits 
7ad0: 74 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72  that must be zer
7ae0: 6f 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c  o in MSB of cell
7af0: 20 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20   offsets */.    
7b00: 6d 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70  mask = ~(((u8)(p
7b10: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
7b20: 29 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d  )-1);.    pEnd =
7b30: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
7b40: 74 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  t + pPage->nCell
7b50: 2a 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66  *2];.    for(pOf
7b60: 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  f=&data[cellOffs
7b70: 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20  et]; pOff!=pEnd 
7b80: 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73  && !((*pOff)&mas
7b90: 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20  k); pOff+=2);.  
7ba0: 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64    if( pOff!=pEnd
7bb0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7bc0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7bd0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
7be0: 23 65 6e 64 69 66 0a 0a 20 20 70 50 61 67 65 2d  #endif..  pPage-
7bf0: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72  >isInit = 1;.  r
7c00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7c10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
7c20: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
7c30: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
7c40: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
7c50: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
7c60: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
7c70: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
7c80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7c90: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
7ca0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
7cb0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
7cc0: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
7cd0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
7ce0: 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  .  int hdr = pPa
7cf0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
7d00: 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20 61   int first;..  a
7d10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7d20: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
7d30: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
7d40: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
7d50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
7d60: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
7d70: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
7d80: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
7d90: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7da0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
7db0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
7dc0: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
7dd0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
7de0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
7df0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
7e00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7e10: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
7e20: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65  mutex) );.  /*me
7e30: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
7e40: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
7e50: 69 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20  ize - hdr);*/.  
7e60: 64 61 74 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67  data[hdr] = flag
7e70: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
7e80: 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73   + 8 + 4*((flags
7e90: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a  &PTF_LEAF)==0);.
7ea0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
7eb0: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
7ec0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
7ed0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7ee0: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
7ef0: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
7f00: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
7f10: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
7f20: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
7f30: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
7f40: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
7f50: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
7f60: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
7f70: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
7f80: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
7f90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
7fa0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
7fb0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
7fc0: 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67  =32768 );.  pPag
7fd0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
7fe0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
7ff0: 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69  .  pPage->idxShi
8000: 66 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ft = 0;.  pPage-
8010: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
8020: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
8030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
8040: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
8050: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
8060: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
8070: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
8080: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
8090: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
80a0: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
80b0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
80c0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
80d0: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
80e0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
80f0: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
8100: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
8110: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
8120: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
8130: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
8140: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
8150: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
8160: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
8170: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
8180: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
8190: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
81a0: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
81b0: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
81c0: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
81d0: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
81e0: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
81f0: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
8200: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
8210: 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oint..*/.int sql
8220: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
8230: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
8240: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
8250: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
8260: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
8270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
8280: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
8290: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
82a0: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
82b0: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
82c0: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
82d0: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
82e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
82f0: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
8300: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ent if true */.)
8310: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
8320: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
8330: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
8340: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8350: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8360: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8370: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8380: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
8390: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
83a0: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
83b0: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
83c0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
83d0: 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
83e0: 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
83f0: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
8400: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
8410: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
8420: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8430: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
8440: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
8450: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
8460: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
8470: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
8480: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
8490: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
84a0: 20 31 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50   100 : 0;.  *ppP
84b0: 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72  age = pPage;.  r
84c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
84d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
84e0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
84f0: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
8500: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
8510: 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20  tine.** is just 
8520: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
8530: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
8540: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  arate calls to.*
8550: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  * sqlite3BtreeGe
8560: 74 50 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69  tPage() and sqli
8570: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
8580: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
8590: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
85a0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
85b0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
85c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
85d0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
85e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
85f0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
8600: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
8610: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
8620: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
8630: 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
8640: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
8650: 50 61 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61  Parent     /* Pa
8660: 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  rent of the page
8670: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
8680: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8690: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
86a0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
86b0: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
86c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
86d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
86e0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
86f0: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
8700: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
8710: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
8720: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70  QLITE_OK && (*pp
8730: 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
8740: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8750: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
8760: 65 28 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65  e(*ppPage, pPare
8770: 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  nt);.    if( rc!
8780: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8790: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
87a0: 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
87b0: 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
87c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
87d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
87e0: 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
87f0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
8800: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
8810: 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
8820: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
8830: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
8840: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
8850: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
8860: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
8870: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
8880: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
8890: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
88a0: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20  age->pBt );.    
88b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
88c0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
88d0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
88e0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
88f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
8900: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
8910: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
8920: 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
8930: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
8940: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8950: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8960: 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  x) );.    sqlite
8970: 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
8980: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
8990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
89a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
89b0: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
89c0: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
89d0: 70 61 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20  page.** reaches 
89e0: 7a 65 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74  zero.  We need t
89f0: 6f 20 75 6e 72 65 66 20 74 68 65 20 70 50 61 72  o unref the pPar
8a00: 65 6e 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e  ent pointer when
8a10: 20 74 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73   that.** happens
8a20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8a30: 20 70 61 67 65 44 65 73 74 72 75 63 74 6f 72 28   pageDestructor(
8a40: 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69  DbPage *pData, i
8a50: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
8a60: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
8a70: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
8a80: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
8a90: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
8aa0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
8ab0: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
8ac0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8ad0: 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73  ->isInit==0 || s
8ae0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8af0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8b00: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
8b10: 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a  age->pParent ){.
8b20: 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
8b30: 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
8b40: 61 72 65 6e 74 3b 0a 20 20 20 20 61 73 73 65 72  arent;.    asser
8b50: 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d  t( pParent->pBt=
8b60: 3d 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20  =pPage->pBt );. 
8b70: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
8b80: 74 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  t = 0;.    relea
8b90: 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b  sePage(pParent);
8ba0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73  .  }.  pPage->is
8bb0: 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Init = 0;.}../*.
8bc0: 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
8bd0: 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
8be0: 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
8bf0: 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
8c00: 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
8c10: 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
8c20: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
8c30: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
8c40: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
8c50: 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
8c60: 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
8c70: 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
8c80: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8c90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8ca0: 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
8cb0: 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
8cc0: 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
8cd0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
8ce0: 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
8cf0: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
8d00: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
8d10: 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
8d20: 44 62 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69  DbPage *pData, i
8d30: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
8d40: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
8d50: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
8d60: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
8d70: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
8d80: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
8d90: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
8da0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
8db0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
8dc0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8dd0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
8de0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
8df0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
8e00: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   0;.    sqlite3B
8e10: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
8e20: 67 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  ge, pPage->pPare
8e30: 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nt);.  }.}../*.*
8e40: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
8e50: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
8e60: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
8e70: 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65   int sqlite3Btre
8e80: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
8e90: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  er(void *pArg, i
8ea0: 6e 74 20 6e 29 7b 0a 20 20 42 74 53 68 61 72 65  nt n){.  BtShare
8eb0: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
8ec0: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
8ed0: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
8ee0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8ef0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
8f00: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
8f10: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
8f20: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
8f30: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
8f40: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
8f50: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
8f60: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
8f70: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
8f80: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
8f90: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
8fa0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
8fb0: 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61  .** a new databa
8fc0: 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d  se with a random
8fd0: 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64   name is created
8fe0: 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79  .  This randomly
8ff0: 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61   named.** databa
9000: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
9010: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c  deleted when sql
9020: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
9030: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49   is called..** I
9040: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
9050: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
9060: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9070: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
9080: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
9090: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
90a0: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
90b0: 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
90c0: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
90d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
90e0: 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
90f0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e   of the file con
9100: 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65  taining the BTre
9110: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
9120: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
9130: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63          /* Assoc
9140: 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68  iated database h
9150: 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65  andle */.  Btree
9160: 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20   **ppBtree,     
9170: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
9180: 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63   new Btree objec
9190: 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  t written here *
91a0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
91c0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ptions */.  int 
91d0: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
91e0: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
91f0: 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
9200: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
9210: 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  () */.){.  sqlit
9220: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
9230: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f     /* The VFS to
9240: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 74   use for this bt
9250: 72 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ree */.  BtShare
9260: 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
9270: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
9280: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
9290: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
92a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
92b0: 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74  /* Handle to ret
92c0: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
92d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
92e0: 6e 74 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75  nt nReserve;.  u
92f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
9300: 48 65 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20  Header[100];..  
9310: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
9320: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
9330: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
9340: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
9350: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
9360: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
9370: 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73 79  atabase. This sy
9380: 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71  mbol is only req
9390: 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69  uired if.  ** ei
93a0: 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61 72  ther of the shar
93b0: 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76  ed-data or autov
93c0: 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20 61  acuum features a
93d0: 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a  re compiled .  *
93e0: 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61  * into the libra
93f0: 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65  ry..  */.#if !de
9400: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9410: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
9420: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
9430: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9440: 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c  UM).  #ifdef SQL
9450: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9460: 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  B.    const int 
9470: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23  isMemdb = 0;.  #
9480: 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69  else.    const i
9490: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69  nt isMemdb = zFi
94a0: 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d  lename && !strcm
94b0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
94c0: 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64  emory:");.  #end
94d0: 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  if.#endif..  ass
94e0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
94f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9500: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
9510: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73  utex) );..  pVfs
9520: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70   = db->pVfs;.  p
9530: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9540: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
9550: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
9560: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9570: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
9580: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
9590: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
95a0: 20 3d 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66   = db;..#if !def
95b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
95c0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
95d0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
95e0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
95f0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
9600: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
9610: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
9620: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
9630: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
9640: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
9650: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
9660: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
9670: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
9680: 30 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61  0.   && (db->fla
9690: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62  gs & SQLITE_Vtab
96a0: 29 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65  )==0.   && zFile
96b0: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
96c0: 65 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66  e[0].  ){.    if
96d0: 28 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  ( sqlite3SharedC
96e0: 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
96f0: 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61       int nFullPa
9700: 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
9710: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
9720: 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61     char *zFullPa
9730: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
9740: 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68  Malloc(nFullPath
9750: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  name);.      sql
9760: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
9770: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
9780: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
9790: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
97a0: 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64  |= SQLITE_Shared
97b0: 43 61 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28  Cache;.      if(
97c0: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
97d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
97e0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
97f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9800: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
9810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
9820: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
9830: 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46  s, zFilename, nF
9840: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
9850: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
9860: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
9870: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
9880: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9890: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
98a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
98b0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
98c0: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66 6f  hared);.      fo
98d0: 72 28 70 42 74 3d 73 71 6c 69 74 65 33 53 68 61  r(pBt=sqlite3Sha
98e0: 72 65 64 43 61 63 68 65 4c 69 73 74 3b 20 70 42  redCacheList; pB
98f0: 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78  t; pBt=pBt->pNex
9900: 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t){.        asse
9910: 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20  rt( pBt->nRef>0 
9920: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
9930: 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61  ==strcmp(zFullPa
9940: 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50  thname, sqlite3P
9950: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74  agerFilename(pBt
9960: 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  ->pPager)).     
9970: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
9980: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
9990: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
99a0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  s ){.          p
99b0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
99c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
99d0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
99e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
99f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9a00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9a10: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
9a20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
9a30: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
9a40: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
9a50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
9a60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
9a70: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
9a80: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
9a90: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
9aa0: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
9ab0: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
9ac0: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
9ad0: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
9ae0: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
9af0: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
9b00: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
9b10: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
9b20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9b30: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
9b40: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
9b50: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
9b60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9b70: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
9b80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9b90: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
9ba0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
9bb0: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
9bc0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
9bd0: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
9be0: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
9bf0: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
9c00: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
9c10: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
9c20: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
9c30: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
9c40: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
9c50: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
9c60: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
9c70: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
9c80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9c90: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
9ca0: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
9cb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9cc0: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
9cd0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
9ce0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9cf0: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
9d00: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
9d10: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
9d20: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
9d30: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
9d40: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
9d50: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
9d60: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
9d70: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
9d80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9d90: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
9da0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
9db0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
9dc0: 3e 62 75 73 79 48 64 72 2e 78 46 75 6e 63 20 3d  >busyHdr.xFunc =
9dd0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76   sqlite3BtreeInv
9de0: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  okeBusyHandler;.
9df0: 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64 72      pBt->busyHdr
9e00: 2e 70 41 72 67 20 3d 20 70 42 74 3b 0a 20 20 20  .pArg = pBt;.   
9e10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
9e20: 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
9e30: 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
9e40: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
9e70: 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20  s, vfsFlags);.  
9e80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9e90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
9ea0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
9eb0: 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
9ec0: 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
9ed0: 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
9ee0: 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
9ef0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9f00: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
9f10: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
9f20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9f30: 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
9f40: 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65  ndler(pBt->pPage
9f50: 72 2c 20 26 70 42 74 2d 3e 62 75 73 79 48 64 72  r, &pBt->busyHdr
9f60: 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
9f70: 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69  pBt;.  .    sqli
9f80: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
9f90: 75 63 74 6f 72 28 70 42 74 2d 3e 70 50 61 67 65  uctor(pBt->pPage
9fa0: 72 2c 20 70 61 67 65 44 65 73 74 72 75 63 74 6f  r, pageDestructo
9fb0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
9fc0: 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
9fd0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67  pBt->pPager, pag
9fe0: 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42  eReinit);.    pB
9ff0: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
a000: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
a010: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65  = 0;.    pBt->re
a020: 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  adOnly = sqlite3
a030: 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
a040: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
a050: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
a060: 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62 48  = get2byte(&zDbH
a070: 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20  eader[16]);.    
a080: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
a090: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
a0a0: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
a0b0: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
a0c0: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
a0d0: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
a0e0: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
a0f0: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
a100: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ize = 0;.      s
a110: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
a120: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
a130: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
a140: 7a 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ze);.#ifndef SQL
a150: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
a160: 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
a170: 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
a180: 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
a190: 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
a1a0: 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
a1b0: 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
a1c0: 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
a1d0: 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
a1e0: 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
a1f0: 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
a200: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
a210: 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
a220: 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
a230: 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
a240: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
a250: 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
a260: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
a270: 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
a280: 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
a290: 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
a2a0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
a2b0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
a2c0: 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
a2d0: 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
a2e0: 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
a2f0: 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
a300: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
a310: 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
a320: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
a330: 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
a340: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
a350: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
a360: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
a370: 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
a380: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
a390: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
a3a0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
a3b0: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
a3c0: 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
a3d0: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
a3e0: 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
a3f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a400: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
a410: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
a420: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
a430: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
a440: 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
a450: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
a460: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
a470: 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
a480: 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
a490: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73     }.    pBt->us
a4a0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
a4b0: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
a4c0: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
a4d0: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
a4e0: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
a4f0: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
a500: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
a510: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
a520: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
a530: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
a540: 67 65 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66  geSize);.   .#if
a550: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a560: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
a570: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
a580: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
a590: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
a5a0: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
a5b0: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
a5c0: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
a5d0: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
a5e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
a5f0: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
a600: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
a610: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
a620: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
a630: 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  1;.      mutexSh
a640: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
a650: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
a660: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
a670: 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TER);.      if( 
a680: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
a690: 45 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6e 66  E && sqlite3Conf
a6a0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
a6b0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
a6c0: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
a6d0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
a6e0: 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
a6f0: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
a700: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
a710: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
a720: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
a730: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a740: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
a750: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
a760: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
a770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a780: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
a790: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
a7a0: 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
a7b0: 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  = sqlite3SharedC
a7c0: 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20  acheList;.      
a7d0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
a7e0: 68 65 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20 20  heList = pBt;.  
a7f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
a800: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
a810: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
a820: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
a830: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a840: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
a850: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
a860: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
a870: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
a880: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
a890: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
a8a0: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
a8b0: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
a8c0: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
a8d0: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
a8e0: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
a8f0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
a900: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
a910: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
a920: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
a930: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
a940: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
a950: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
a960: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
a970: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
a990: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
a9a0: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
a9b0: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
a9c0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
a9d0: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
a9e0: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
a9f0: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
aa00: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
aa10: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
aa20: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
aa30: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
aa40: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
aa50: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
aa60: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
aa70: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
aa80: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
aa90: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
aaa0: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
aab0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
aac0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
aad0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
aae0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
aaf0: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
ab00: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
ab10: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
ab20: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
ab30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
ab40: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
ab50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ab60: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
ab70: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
ab80: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
ab90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
aba0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
abb0: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
abc0: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
abd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
abe0: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
abf0: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
ac00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
ac10: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
ac20: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
ac30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
ac40: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
ac50: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
ac60: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
ac70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ac80: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
ac90: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
aca0: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
acb0: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
acc0: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
acd0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
ace0: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
acf0: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
ad00: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
ad10: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
ad20: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
ad30: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
ad40: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
ad50: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
ad60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
ad70: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
ad80: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
ad90: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
ada0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
adb0: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
adc0: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
add0: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
ade0: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
adf0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
ae00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
ae10: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
ae20: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
ae30: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
ae40: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
ae50: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
ae60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ae70: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
ae80: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
ae90: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
aea0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
aeb0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
aec0: 69 73 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  ist==pBt ){.    
aed0: 20 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43    sqlite3SharedC
aee0: 61 63 68 65 4c 69 73 74 20 3d 20 70 42 74 2d 3e  acheList = pBt->
aef0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
af00: 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
af10: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
af20: 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20 77 68  heList;.      wh
af30: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
af40: 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
af50: 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
af60: 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
af70: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
af80: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
af90: 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
afa0: 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
afb0: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
afc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
afd0: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
afe0: 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
aff0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
b000: 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
b010: 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
b020: 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
b030: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
b040: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
b050: 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
b060: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
b070: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
b080: 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
b090: 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
b0a0: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
b0b0: 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
b0c0: 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
b0d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
b0e0: 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
b0f0: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
b100: 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
b110: 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
b120: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
b130: 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
b140: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
b150: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
b160: 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
b170: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
b180: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b190: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
b1a0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
b1b0: 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
b1c0: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29   pBt->pTmpSpace)
b1d0: 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ;.  pBt->pTmpSpa
b1e0: 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 0;.}../*.**
b1f0: 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
b200: 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
b210: 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
b220: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
b230: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
b240: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
b250: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
b260: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
b270: 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
b280: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
b290: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
b2a0: 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
b2b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b2c0: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
b2d0: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
b2e0: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
b2f0: 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
b300: 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
b310: 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
b320: 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
b330: 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
b340: 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
b350: 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
b360: 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
b370: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
b380: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
b390: 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
b3a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
b3b0: 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
b3c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
b3d0: 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
b3e0: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
b3f0: 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
b400: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
b410: 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
b420: 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
b430: 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
b440: 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
b450: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
b460: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
b470: 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
b480: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
b490: 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
b4a0: 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
b4b0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
b4c0: 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
b4d0: 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
b4e0: 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
b4f0: 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
b500: 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
b510: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
b520: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
b530: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
b540: 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
b550: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
b560: 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
b570: 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
b580: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
b590: 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
b5a0: 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
b5b0: 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
b5c0: 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
b5d0: 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
b5e0: 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
b5f0: 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
b600: 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
b610: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
b620: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
b630: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
b640: 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
b650: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
b660: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
b670: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
b680: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
b690: 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
b6a0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
b6b0: 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
b6c0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
b6d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b6e0: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
b6f0: 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
b700: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
b710: 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
b720: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
b730: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
b740: 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
b750: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
b760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
b770: 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
b780: 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
b790: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
b7a0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
b7b0: 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
b7c0: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
b7d0: 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
b7e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
b7f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
b800: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
b810: 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
b820: 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
b830: 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
b840: 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
b850: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
b860: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
b870: 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
b880: 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
b890: 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
b8a0: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
b8b0: 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
b8c0: 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
b8d0: 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
b8e0: 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
b8f0: 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
b900: 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
b910: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
b920: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
b930: 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
b940: 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
b950: 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
b960: 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
b970: 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
b980: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
b990: 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
b9a0: 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
b9b0: 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
b9c0: 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
b9d0: 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
b9e0: 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
b9f0: 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
ba00: 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
ba10: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
ba20: 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
ba30: 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
ba40: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
ba50: 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
ba60: 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
ba70: 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
ba80: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
ba90: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
baa0: 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
bab0: 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
bac0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
bad0: 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
bae0: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
baf0: 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
bb00: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
bb10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bb20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
bb30: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
bb40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
bb50: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
bb60: 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
bb70: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
bb80: 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
bb90: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
bba0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bbb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
bbc0: 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
bbd0: 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
bbe0: 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
bbf0: 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
bc00: 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
bc10: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
bc20: 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
bc30: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
bc40: 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
bc50: 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
bc60: 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
bc70: 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
bc80: 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
bc90: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
bca0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
bcb0: 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
bcc0: 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
bcd0: 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
bce0: 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
bcf0: 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
bd00: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
bd10: 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
bd20: 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
bd30: 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
bd40: 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
bd50: 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
bd60: 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
bd70: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
bd80: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
bd90: 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
bda0: 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
bdb0: 4c 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20  Level(Btree *p, 
bdc0: 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66  int level, int f
bdd0: 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68  ullSync){.  BtSh
bde0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
bdf0: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
be00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
be10: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
be20: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
be30: 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
be40: 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
be50: 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
be60: 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
be70: 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
be80: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
be90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bea0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
beb0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
bec0: 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
bed0: 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
bee0: 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
bef0: 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
bf00: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
bf10: 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
bf20: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
bf30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bf40: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
bf50: 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
bf60: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
bf70: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
bf80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bf90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
bfa0: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
bfb0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
bfc0: 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
bfd0: 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
bfe0: 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
bff0: 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
c000: 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
c010: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
c020: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
c030: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
c040: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c050: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
c060: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
c070: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
c080: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
c090: 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
c0a0: 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
c0b0: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
c0c0: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
c0d0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
c0e0: 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
c0f0: 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
c100: 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
c110: 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
c120: 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
c130: 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
c140: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
c150: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
c160: 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
c170: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
c180: 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
c190: 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
c1a0: 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
c1b0: 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
c1c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c1d0: 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
c1e0: 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
c1f0: 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
c200: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
c210: 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
c220: 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
c230: 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
c240: 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
c250: 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
c260: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
c270: 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
c280: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
c290: 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
c2a0: 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
c2b0: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
c2c0: 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
c2d0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
c2e0: 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
c2f0: 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
c300: 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
c310: 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
c320: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c330: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
c340: 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
c350: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
c360: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
c370: 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20  SizeFixed ){.   
c380: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c390: 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
c3a0: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
c3b0: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
c3c0: 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
c3d0: 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
c3e0: 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
c3f0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
c400: 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
c410: 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
c420: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
c430: 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
c440: 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
c450: 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
c460: 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
c470: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
c480: 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
c490: 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d  >pPage1 && !pBt-
c4a0: 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
c4b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
c4c0: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
c4d0: 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
c4e0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c4f0: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
c500: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
c510: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
c520: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62  .  }.  pBt->usab
c530: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
c540: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
c550: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
c560: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c570: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c580: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
c590: 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
c5a0: 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
c5b0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
c5c0: 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
c5d0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
c5e0: 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69  t->pageSize;.}.i
c5f0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
c600: 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
c610: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
c620: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
c630: 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
c640: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
c650: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
c660: 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
c670: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c680: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
c690: 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
c6a0: 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
c6b0: 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
c6c0: 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
c6d0: 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
c6e0: 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
c6f0: 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
c700: 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
c710: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
c720: 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
c730: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
c740: 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
c750: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
c760: 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
c770: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
c780: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
c790: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
c7a0: 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
c7b0: 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
c7c0: 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
c7d0: 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
c7e0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c7f0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23  .  return n;.}.#
c800: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
c810: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
c820: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
c830: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c840: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a  OMIT_VACUUM) */.
c850: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
c860: 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
c870: 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
c880: 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
c890: 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
c8a0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
c8b0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
c8c0: 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
c8d0: 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
c8e0: 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
c8f0: 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
c900: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
c910: 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
c920: 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
c930: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
c940: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
c950: 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
c960: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
c970: 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
c980: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
c990: 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
c9a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c9b0: 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
c9c0: 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
c9d0: 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
c9e0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
c9f0: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
ca00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 61  LITE_OK;.  int a
ca10: 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3f  v = (autoVacuum?
ca20: 31 3a 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  1:0);..  sqlite3
ca30: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
ca40: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
ca50: 7a 65 46 69 78 65 64 20 26 26 20 61 76 21 3d 70  zeFixed && av!=p
ca60: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
ca70: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ca80: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
ca90: 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
caa0: 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20  toVacuum = av;. 
cab0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
cac0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
cad0: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
cae0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
caf0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
cb00: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
cb10: 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
cb20: 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
cb30: 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
cb40: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
cb50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cb60: 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
cb70: 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
cb80: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
cb90: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
cba0: 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
cbb0: 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
cbc0: 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
cbd0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
cbe0: 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
cbf0: 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
cc00: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
cc10: 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
cc20: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
cc30: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
cc40: 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
cc50: 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
cc60: 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
cc70: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
cc80: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
cc90: 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
cca0: 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
ccb0: 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
ccc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ccd0: 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
cce0: 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
ccf0: 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
cd00: 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
cd10: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
cd20: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
cd30: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
cd40: 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
cd50: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
cd60: 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
cd70: 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
cd80: 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
cd90: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
cda0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
cdb0: 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
cdc0: 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
cdd0: 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
cde0: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
cdf0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
ce00: 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
ce10: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
ce20: 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
ce30: 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61  Page1;.  int nPa
ce40: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
ce50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ce60: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
ce70: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
ce80: 65 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e1 ) return SQLI
ce90: 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71  TE_OK;.  rc = sq
cea0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
ceb0: 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
cec0: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
ced0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
cee0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
cef0: 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
cf00: 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
cf10: 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
cf20: 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
cf30: 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
cf40: 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72   file. .  */.  r
cf50: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
cf60: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
cf70: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
cf80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cf90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
cfa0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
cfb0: 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  d;.  }else if( n
cfc0: 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e  Page>0 ){.    in
cfd0: 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  t pageSize;.    
cfe0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
cff0: 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
d000: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
d010: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
d020: 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d  OTADB;.    if( m
d030: 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
d040: 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
d050: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
d060: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
d070: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
d080: 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
d090: 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f        pBt->readO
d0a0: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nly = 1;.    }. 
d0b0: 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
d0c0: 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
d0d0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
d0e0: 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
d0f0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
d100: 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
d110: 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
d120: 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
d130: 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
d140: 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
d150: 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
d160: 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
d170: 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
d180: 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
d190: 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
d1a0: 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
d1b0: 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
d1c0: 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
d1d0: 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
d1e0: 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
d1f0: 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
d200: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
d210: 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
d220: 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
d230: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
d240: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
d250: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
d260: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
d270: 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20  &page1[16]);.   
d280: 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
d290: 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20  1)&pageSize)!=0 
d2a0: 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20  || pageSize<512 
d2b0: 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49  ||.        (SQLI
d2c0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
d2d0: 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53 69  <32768 && pageSi
d2e0: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
d2f0: 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a  GE_SIZE).    ){.
d300: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
d310: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
d320: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
d330: 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
d340: 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
d350: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
d360: 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
d370: 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42  if( pageSize!=pB
d380: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
d390: 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
d3a0: 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
d3b0: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
d3c0: 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
d3d0: 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
d3e0: 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
d3f0: 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
d400: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
d410: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
d420: 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
d430: 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
d440: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
d450: 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
d460: 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
d470: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
d480: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
d490: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
d4a0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
d4b0: 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
d4c0: 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
d4d0: 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
d4e0: 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
d4f0: 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
d500: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
d510: 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
d520: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
d530: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
d540: 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
d550: 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
d560: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
d570: 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
d580: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
d590: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
d5a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d5b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
d5c0: 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a  ableSize<500 ){.
d5d0: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
d5e0: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
d5f0: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
d600: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
d610: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
d620: 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
d630: 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
d640: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
d650: 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
d660: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
d670: 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
d680: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
d690: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
d6a0: 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
d6b0: 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
d6c0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
d6d0: 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
d6e0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
d6f0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
d700: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
d710: 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
d720: 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
d730: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
d740: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
d750: 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
d760: 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
d770: 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
d780: 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
d790: 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
d7a0: 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
d7b0: 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
d7c0: 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
d7d0: 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
d7e0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
d7f0: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
d800: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
d810: 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
d820: 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
d830: 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
d840: 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
d850: 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
d860: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
d870: 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
d880: 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
d890: 65 20 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64  e poiner, a head
d8a0: 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
d8b0: 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
d8c0: 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
d8d0: 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
d8e0: 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
d8f0: 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
d900: 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
d910: 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
d920: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70  t->maxLocal = (p
d930: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
d940: 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*64/255 - 23;.
d950: 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
d960: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
d970: 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
d980: 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65  23;.  pBt->maxLe
d990: 61 66 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  af = pBt->usable
d9a0: 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74  Size - 35;.  pBt
d9b0: 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74  ->minLeaf = (pBt
d9c0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
d9d0: 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
d9e0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
d9f0: 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
da00: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
da10: 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
da20: 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75  = pPage1;.  retu
da30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
da40: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
da50: 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
da60: 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
da70: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
da80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
da90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
daa0: 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74  orks like lockBt
dab0: 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68 61  ree() except tha
dac0: 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65  t it also invoke
dad0: 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61  s the.** busy ca
dae0: 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65 20  llback if there 
daf0: 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  is lock contenti
db00: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
db10: 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  t lockBtreeWithR
db20: 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65 66  etry(Btree *pRef
db30: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
db40: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
db50: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
db60: 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29  HoldsMutex(pRef)
db70: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e   );.  if( pRef->
db80: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
db90: 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e  ONE ){.    u8 in
dba0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52  Transaction = pR
dbb0: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
dbc0: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65  action;.    btre
dbd0: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
dbe0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
dbf0: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
dc00: 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20  s(pRef, 0);.    
dc10: 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61  pRef->pBt->inTra
dc20: 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61  nsaction = inTra
dc30: 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52  nsaction;.    pR
dc40: 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52  ef->inTrans = TR
dc50: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66  ANS_NONE;.    if
dc60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dc70: 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70  ){.      pRef->p
dc80: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
dc90: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74  --;.    }.    bt
dca0: 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65  reeIntegrity(pRe
dcb0: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
dcc0: 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a   rc;.}.       ..
dcd0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
dce0: 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
dcf0: 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
dd00: 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
dd10: 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
dd20: 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
dd30: 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
dd40: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
dd50: 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
dd60: 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
dd70: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
dd80: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
dd90: 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
dda0: 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
ddb0: 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
ddc0: 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
ddd0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
dde0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
ddf0: 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  sors, this routi
de00: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
de10: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
de20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
de30: 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
de40: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
de50: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
de60: 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
de70: 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
de80: 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
de90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
dea0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
deb0: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
dec0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
ded0: 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
dee0: 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70  >pCursor==0 && p
def0: 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
df00: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
df10: 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
df20: 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b  t->pPager)>=1 ){
df30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
df40: 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
df50: 61 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20  a );.#if 0.     
df60: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
df70: 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ->aData==0 ){.  
df80: 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
df90: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67  Page = pBt->pPag
dfa0: 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e1;.        pPag
dfb0: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
dfc0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
dfd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
dfe0: 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70          pPage->p
dff0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
e000: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
e010: 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  1;.      }.#endi
e020: 66 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  f.      releaseP
e030: 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29  age(pBt->pPage1)
e040: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
e050: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
e060: 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
e070: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
e080: 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74 61  reate a new data
e090: 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
e0a0: 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
e0b0: 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  age of the.** fi
e0c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
e0d0: 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
e0e0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
e0f0: 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
e100: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
e110: 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ata;.  int rc;. 
e120: 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61   int nPage;..  a
e130: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e140: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
e150: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
e160: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
e170: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
e180: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
e190: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e1a0: 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  || nPage>0 ){.  
e1b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
e1c0: 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
e1d0: 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
e1e0: 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
e1f0: 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
e200: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e210: 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
e220: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
e230: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
e240: 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
e250: 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
e260: 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
e270: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
e280: 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
e290: 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74  =16 );.  put2byt
e2a0: 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74  e(&data[16], pBt
e2b0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
e2c0: 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
e2d0: 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64  ata[19] = 1;.  d
e2e0: 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70  ata[20] = pBt->p
e2f0: 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
e300: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74  sableSize;.  dat
e310: 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
e320: 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
e330: 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
e340: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
e350: 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
e360: 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
e370: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
e380: 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
e390: 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ;.  pBt->pageSiz
e3a0: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
e3b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e3c0: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
e3d0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
e3e0: 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
e3f0: 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
e400: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
e410: 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
e420: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
e430: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
e440: 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
e450: 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
e460: 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
e470: 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
e480: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
e490: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
e4a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e4b0: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
e4c0: 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
e4d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
e4e0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
e4f0: 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
e500: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
e510: 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
e520: 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
e530: 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
e540: 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
e550: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
e560: 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
e570: 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
e580: 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
e590: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
e5a0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
e5b0: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
e5c0: 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
e5d0: 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
e5e0: 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
e5f0: 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
e600: 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
e610: 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
e620: 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
e630: 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
e640: 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
e650: 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
e660: 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
e670: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
e680: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
e690: 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
e6a0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
e6b0: 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
e6c0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
e6d0: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
e6e0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
e6f0: 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
e700: 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
e710: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
e720: 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
e730: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
e740: 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
e750: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e760: 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
e770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e780: 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
e790: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e7a0: 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
e7b0: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e7c0: 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
e7d0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e7e0: 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
e7f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
e800: 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
e810: 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
e820: 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
e830: 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
e840: 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
e850: 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
e860: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
e870: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
e880: 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
e890: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e8a0: 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
e8b0: 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
e8c0: 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
e8d0: 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
e8e0: 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
e8f0: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
e900: 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
e910: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
e920: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
e930: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
e940: 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
e950: 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
e960: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
e970: 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
e980: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
e990: 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
e9a0: 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
e9b0: 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
e9c0: 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
e9d0: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
e9e0: 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
e9f0: 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
ea00: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
ea10: 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
ea20: 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
ea30: 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
ea40: 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
ea50: 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
ea60: 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
ea70: 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
ea80: 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
ea90: 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
eaa0: 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
eab0: 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
eac0: 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
ead0: 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
eae0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
eaf0: 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
eb00: 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
eb10: 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
eb20: 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
eb30: 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
eb40: 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
eb50: 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
eb60: 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
eb70: 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
eb80: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
eb90: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
eba0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
ebb0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
ebc0: 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
ebd0: 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e  p->db;.  btreeIn
ebe0: 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
ebf0: 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
ec00: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
ec10: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
ec20: 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
ec30: 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
ec40: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
ec50: 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
ec60: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
ec70: 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
ec80: 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
ec90: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
eca0: 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
ecb0: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
ecc0: 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
ecd0: 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
ece0: 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
ecf0: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
ed00: 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
ed10: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
ed20: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
ed30: 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
ed40: 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
ed50: 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
ed60: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
ed70: 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
ed80: 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  egun;.  }..  /* 
ed90: 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
eda0: 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
edb0: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
edc0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
edd0: 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
ede0: 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
edf0: 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
ee00: 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
ee10: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
ee20: 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
ee30: 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a  SQLITE_BUSY..  *
ee40: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  /.  if( pBt->inT
ee50: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
ee60: 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c 61  S_WRITE && wrfla
ee70: 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
ee80: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
ee90: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
eea0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
eeb0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
eec0: 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77 72 66  _CACHE.  if( wrf
eed0: 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c  lag>1 ){.    BtL
eee0: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ock *pIter;.    
eef0: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
ef00: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
ef10: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
ef20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
ef30: 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
ef40: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
ef50: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
ef60: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
ef70: 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  un;.      }.    
ef80: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
ef90: 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74  do {.    if( pBt
efa0: 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
efb0: 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
efc0: 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28   rc = lockBtree(
efd0: 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  pBt);.      }whi
efe0: 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
eff0: 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
f000: 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  _OK );.    }..  
f010: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f020: 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
f030: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
f040: 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
f050: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f060: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
f070: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
f080: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f090: 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
f0a0: 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72 66 6c  1->pDbPage, wrfl
f0b0: 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ag>1);.        i
f0c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
f0e0: 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
f0f0: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
f100: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
f110: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f120: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
f130: 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d  f( wrflag ) pBt-
f140: 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
f150: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e   }else{.      un
f160: 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
f170: 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
f180: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
f190: 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
f1a0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
f1b0: 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
f1c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
f1d0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
f1e0: 64 6c 65 72 28 70 42 74 2c 20 30 29 20 29 3b 0a  dler(pBt, 0) );.
f1f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f200: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
f210: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
f220: 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
f230: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
f240: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n++;.    }.    p
f250: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
f260: 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
f270: 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
f280: 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
f290: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
f2a0: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
f2b0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
f2c0: 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
f2d0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
f2e0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
f2f0: 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c  CHE.    if( wrfl
f300: 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73  ag>1 ){.      as
f310: 73 65 72 74 28 20 21 70 42 74 2d 3e 70 45 78 63  sert( !pBt->pExc
f320: 6c 75 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20  lusive );.      
f330: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20  pBt->pExclusive 
f340: 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = p;.    }.#endi
f350: 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  f.  }...trans_be
f360: 67 75 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74 65  gun:.  btreeInte
f370: 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
f380: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
f390: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f3a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
f3b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
f3c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
f3d0: 70 61 67 65 73 2e 20 20 4f 72 20 72 65 74 75 72  pages.  Or retur
f3e0: 6e 20 2d 31 20 69 66 0a 2a 2a 20 74 68 65 72 65  n -1 if.** there
f3f0: 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20   is any kind of 
f400: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
f410: 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f   int pagerPageco
f420: 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
f430: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
f440: 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 72 63 20  int nPage;.  rc 
f450: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
f460: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
f470: 26 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  &nPage);.  retur
f480: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
f490: 3f 6e 50 61 67 65 3a 2d 31 29 3b 0a 7d 0a 0a 0a  ?nPage:-1);.}...
f4a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f4b0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
f4c0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
f4d0: 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
f4e0: 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
f4f0: 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
f500: 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
f510: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
f520: 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
f530: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
f540: 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
f550: 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
f560: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
f570: 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
f580: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
f590: 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
f5a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
f5b0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
f5e0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
f5f0: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
f620: 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
f630: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
f640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f650: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f660: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
f670: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
f680: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69  ge->pBt;.  int i
f690: 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
f6a0: 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
f6b0: 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
f6c0: 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
f6d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
f6e0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
f6f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
f700: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
f710: 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
f720: 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge->pParent);.  
f730: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f740: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
f750: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
f760: 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
f770: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
f780: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
f790: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
f7a0: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
f7b0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
f7c0: 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
f7d0: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
f7e0: 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
f7f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f800: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65  ){.      goto se
f810: 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
f820: 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
f830: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f840: 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
f850: 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
f860: 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
f870: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
f880: 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
f890: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
f8a0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 69 66 28  gno);.       if(
f8b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f8c0: 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
f8d0: 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
f8e0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
f8f0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
f900: 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
f910: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
f920: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
f930: 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
f940: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
f950: 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
f960: 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
f970: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74   pgno);.  }..set
f980: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
f990: 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
f9a0: 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
f9b0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f9c0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
f9d0: 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63  e on pPage, whic
f9e0: 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  h is guarenteed 
f9f0: 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61  to be a btree pa
fa00: 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66  ge, not an overf
fa10: 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20  low.** page, is 
fa20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
fa30: 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20  e iFrom. Modify 
fa40: 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20  this pointer so 
fa50: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
fa60: 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65  o.** iTo. Parame
fa70: 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
fa80: 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
fa90: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f  pointer to be mo
faa0: 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66  dified, as .** f
fab0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
fac0: 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
fad0: 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
fae0: 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
faf0: 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
fb00: 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
fb10: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
fb20: 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
fb30: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
fb40: 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
fb50: 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
fb60: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
fb70: 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb90: 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
fba0: 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
fbb0: 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
fbc0: 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
fbd0: 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
fbe0: 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
fbf0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
fc00: 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
fc10: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fc20: 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
fc30: 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
fc40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
fc50: 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
fc60: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
fc70: 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
fc80: 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
fc90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fca0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
fcb0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
fcc0: 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
fcd0: 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
fce0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
fcf0: 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
fd00: 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
fd10: 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
fd20: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
fd30: 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
fd40: 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
fd50: 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
fd60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
fd70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
fd80: 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
fd90: 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
fda0: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
fdb0: 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20   int isInitOrig 
fdc0: 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
fdd0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
fde0: 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
fdf0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
fe00: 50 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a  Page(pPage, 0);.
fe10: 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
fe20: 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
fe30: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
fe40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
fe50: 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
fe60: 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
fe70: 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
fe80: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
fe90: 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
fea0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
feb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
fec0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
fed0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
fee0: 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
fef0: 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
ff00: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
ff10: 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65  m==get4byte(&pCe
ff20: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
ff30: 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  w]) ){.         
ff40: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
ff50: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
ff60: 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
ff70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ff80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ff90: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
ffa0: 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
ffb0: 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
ffc0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
ffd0: 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
ffe0: 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
fff0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
10000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10010 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
10020 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
10030 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
10040 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
10050 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
10060 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
10070 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
10080 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
10090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
100a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
100b0 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
100c0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
100d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
100e0 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
100f0 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
10100 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
10110 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
10120 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
10130 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
10140 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
10150 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
10160 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
10170 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
10180 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
10190 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
101a0 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74  s valid..*/.stat
101b0 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
101c0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
101d0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
101e0 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
101f0 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
10200 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
10210 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
10220 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
10230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
10240 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
10250 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
10260 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
10270 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
10280 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
10290 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
102a0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
102b0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
102c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
102d0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
102e0 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
102f0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b   int isCommit.){
10300 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
10310 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
10320 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
10330 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
10340 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
10350 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
10360 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
10370 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
10380 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
10390 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
103a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
103b0 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
103c0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
103d0 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
103e0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
103f0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
10400 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
10410 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10420 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10430 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
10440 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
10450 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  pBt );..  /* Mov
10460 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
10470 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
10480 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
10490 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
104a0 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
104b0 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
104c0 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
104d0 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
104e0 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
104f0 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
10500 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
10510 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
10520 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10530 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
10540 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
10550 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
10560 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
10570 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10580 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10590 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
105a0 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
105b0 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
105c0 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
105d0 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
105e0 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
105f0 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
10600 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
10610 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
10620 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
10630 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
10640 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
10650 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
10660 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
10670 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
10680 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
10690 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
106a0 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
106b0 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
106c0 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
106d0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
106e0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
106f0 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
10700 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
10710 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
10720 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
10730 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
10740 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
10750 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
10760 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
10770 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
10780 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
10790 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
107a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
107b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
107c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
107d0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
107e0 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
107f0 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
10800 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
10810 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
10820 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
10830 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
10840 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
10850 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 29  LOW2, iFreePage)
10860 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10880 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10890 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
108a0 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
108b0 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
108c0 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
108d0 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
108e0 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
108f0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
10900 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
10910 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
10920 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
10930 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
10940 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
10950 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
10960 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
10970 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
10980 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
10990 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
109a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
109b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
109c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
109d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
109e0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
109f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
10a00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10a20 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
10a30 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
10a40 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
10a50 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
10a60 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
10a70 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
10a80 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
10a90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
10aa0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
10ab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10ac0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
10ad0 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
10ae0 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
10af0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  trPage);.    }. 
10b00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10b10 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
10b20 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
10b30 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
10b40 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
10b50 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
10b60 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
10b70 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
10b80 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
10b90 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
10ba0 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
10bb0 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
10bc0 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
10bd0 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75  cessful,.** retu
10be0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
10bf0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
10c00 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
10c10 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69  refore no.** poi
10c20 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68  nt in calling th
10c30 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
10c40 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
10c50 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  E_DONE..**.** Mo
10c60 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74  re specificly, t
10c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
10c80 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
10c90 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74  nize the .** dat
10ca0 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68  abase so that th
10cb0 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
10cc0 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
10cd0 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e  y in use.** is n
10ce0 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
10cf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46  .**.** If the nF
10d00 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  in parameter is 
10d10 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d  non-zero, the im
10d20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73  plementation ass
10d30 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
10d40 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
10d50 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
10d60 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
10d70 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
10d80 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
10d90 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
10da0 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
10db0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
10dc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10dd0 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
10de0 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
10df0 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
10e00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10e10 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
10e20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
10e30 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e  gno nFin){.  Pgn
10e40 6f 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20  o iLastPg;      
10e50 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
10e60 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
10e70 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  ase */.  Pgno nF
10e80 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
10e90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10ea0 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
10eb0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
10ec0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10ed0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10ee0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
10ef0 4c 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54  LastPg = pBt->nT
10f00 72 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61 73  runc;.  if( iLas
10f10 74 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c  tPg==0 ){.    iL
10f20 61 73 74 50 67 20 3d 20 70 61 67 65 72 50 61 67  astPg = pagerPag
10f30 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
10f40 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
10f50 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
10f60 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
10f70 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
10f80 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
10f90 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
10fa0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
10fb0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
10fc0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
10fd0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
10fe0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
10ff0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
11000 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e  eList==0 || nFin
11010 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20  ==iLastPg ){.   
11020 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11030 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
11040 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
11050 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
11060 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
11070 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11090 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
110a0 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
110b0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
110c0 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
110d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
110e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
110f0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
11100 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
11110 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d        if( nFin==
11120 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
11130 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
11140 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
11150 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
11160 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
11170 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69         ** if nFi
11180 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  n is non-zero. I
11190 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
111a0 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
111b0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
111c0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
111d0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
111e0 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
111f0 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
11200 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
11210 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
11220 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
11230 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
11240 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
11250 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
11260 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
11270 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
11280 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
11290 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
112a0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
112b0 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tPg, 1);.       
112c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
112d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
112e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
112f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
11300 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
11310 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
11320 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
11330 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
11340 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
11350 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
11360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11370 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
11380 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
11390 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
113a0 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
113b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
113c0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
113d0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
113e0 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
113f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
11410 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
11420 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  }..      /* If n
11430 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  Fin is zero, thi
11440 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
11450 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
11460 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
11470 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
11480 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
11490 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
114a0 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
114b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
114c0 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
114d0 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73  hand, if nFin is
114e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
114f0 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
11500 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
11510 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
11520 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
11530 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
11540 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
11550 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
11560 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
11570 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
11580 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
11590 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
115a0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
115b0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
115c0 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b  &iFreePg, 0, 0);
115d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
115e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
115f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
11600 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
11610 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
11620 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
11630 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11640 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
11650 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30   }while( nFin!=0
11660 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
11670 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11680 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
11690 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
116a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
116b0 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67  gerWrite(pLastPg
116c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
116d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
116e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
116f0 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
11700 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
11710 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
11720 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30  iFreePg, nFin!=0
11730 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11740 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
11750 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
11760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11770 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11780 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
11790 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e   }.  }..  pBt->n
117a0 54 72 75 6e 63 20 3d 20 69 4c 61 73 74 50 67 20  Trunc = iLastPg 
117b0 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 42  - 1;.  while( pB
117c0 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45 4e 44 49  t->nTrunc==PENDI
117d0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
117e0 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
117f0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54 72 75 6e  (pBt, pBt->nTrun
11800 63 29 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e  c) ){.    pBt->n
11810 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72  Trunc--;.  }.  r
11820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
11840 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
11850 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
11860 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
11870 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
11880 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
11890 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
118a0 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
118b0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
118c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
118d0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
118e0 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
118f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
11900 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
11910 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
11920 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
11930 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
11940 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c  o error occured,
11950 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
11960 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
11970 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
11980 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
11990 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
119a0 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
119b0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
119c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
119d0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
119e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
119f0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
11a00 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
11a10 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
11a20 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
11a30 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
11a40 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
11a50 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
11a60 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
11a70 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
11a80 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
11a90 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
11aa0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
11ab0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
11ac0 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a  ep(pBt, 0);.  }.
11ad0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11ae0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11af0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11b00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
11b10 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
11b20 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
11b30 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
11b40 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
11b50 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
11b60 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
11b70 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
11b80 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
11b90 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
11ba0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
11bb0 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
11bc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11bd0 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
11be0 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
11bf0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
11c00 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
11c10 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
11c20 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
11c30 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
11c40 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
11c50 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
11c60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11c70 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
11c80 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
11c90 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b   Pgno *pnTrunc){
11ca0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11cb0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
11cc0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
11cd0 61 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ager;.#ifndef ND
11ce0 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66 20  EBUG.  int nRef 
11cf0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
11d00 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  fcount(pPager);.
11d10 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
11d20 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
11d30 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
11d40 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
11d50 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
11d60 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
11d70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
11d80 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
11d90 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
11da0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a  Pgno nFin = 0;..
11db0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
11dc0 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc==0 ){.      
11dd0 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20  Pgno nFree;.    
11de0 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a    Pgno nPtrmap;.
11df0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
11e00 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65  pgsz = pBt->page
11e10 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Size;.      int 
11e20 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61 67  nOrig = pagerPag
11e30 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
11e40 65 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  er);..      if( 
11e50 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
11e60 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20  t, nOrig) ){.   
11e70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11e80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11e90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11ea0 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  f( nOrig==PENDIN
11eb0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
11ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72 69   ){.        nOri
11ed0 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
11ee0 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62     nFree = get4b
11ef0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
11f00 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
11f10 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
11f20 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
11f30 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
11f40 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
11f50 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46 69  sz/5);.      nFi
11f60 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
11f70 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
11f80 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e     if( nOrig>PEN
11f90 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
11fa0 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e  Bt) && nFin<=PEN
11fb0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
11fc0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  Bt) ){.        n
11fd0 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Fin--;.      }. 
11fe0 20 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d       while( PTRM
11ff0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
12000 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
12010 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
12020 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
12030 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nFin--;.      }.
12040 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65      }..    while
12050 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12060 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
12070 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
12080 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  , nFin);.    }. 
12090 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
120a0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
120b0 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c  assert(nFin==0 |
120c0 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30  | pBt->nTrunc==0
120d0 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e   || nFin<=pBt->n
120e0 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 72 63  Trunc);.      rc
120f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12100 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72      if( pBt->nTr
12110 75 6e 63 20 26 26 20 6e 46 69 6e 20 29 7b 0a 20  unc && nFin ){. 
12120 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12130 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
12140 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
12150 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
12160 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
12170 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
12180 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
12190 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
121a0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
121b0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  .        pBt->nT
121c0 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  runc = nFin;.   
121d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
121e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
121f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12200 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
12210 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
12220 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
12230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
12240 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54  nTrunc = pBt->nT
12250 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  runc;.    pBt->n
12260 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Trunc = 0;.  }. 
12270 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
12280 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
12290 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
122a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
122b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
122c0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
122d0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
122e0 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
122f0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
12300 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
12310 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12320 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
12330 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
12340 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
12350 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
12360 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
12370 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
12380 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
12390 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
123a0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
123b0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
123c0 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
123d0 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
123e0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
123f0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
12400 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
12410 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
12420 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
12430 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
12440 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
12450 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
12460 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
12470 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
12480 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
12490 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
124a0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
124b0 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
124c0 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
124d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
124e0 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
124f0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
12500 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
12510 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
12520 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12530 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
12540 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
12550 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29  te3BtreeCommit()
12560 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
12570 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
12580 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
12590 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
125a0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
125b0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
125c0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
125d0 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
125e0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
125f0 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
12600 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
12610 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
12620 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
12630 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
12640 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12650 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
12660 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
12670 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
12680 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
12690 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
126a0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
126b0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
126c0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
126d0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
126e0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
126f0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
12700 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
12710 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
12720 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
12730 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
12740 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
12750 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
12760 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
12770 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
12780 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
12790 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
127a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
127b0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
127c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
127d0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
127e0 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
127f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
12800 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12810 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
12820 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
12830 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
12840 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12850 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
12860 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
12870 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
12880 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
12890 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72 75  t;.    Pgno nTru
128a0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  nc = 0;.    sqli
128b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
128c0 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
128d0 70 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  p->db;.#ifndef S
128e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
128f0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
12900 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
12910 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
12920 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
12930 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20  , &nTrunc); .   
12940 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12950 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12960 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12970 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
12980 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
12990 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
129a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
129b0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
129c0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
129d0 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 2c 20  Master, nTrunc, 
129e0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
129f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12a00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12a10 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
12a20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
12a30 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
12a40 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
12a50 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
12a60 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
12a70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
12a80 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
12a90 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  * sqlite3BtreeSy
12aa0 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65  nc() routine doe
12ab0 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
12ac0 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  e and should be 
12ad0 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72  invoked.** prior
12ae0 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
12af0 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73   routine.  The s
12b00 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
12b10 29 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a  ) routine did.**
12b20 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
12b30 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
12b40 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
12b50 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
12b60 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
12b70 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
12b80 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
12b90 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
12ba0 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
12bb0 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
12bc0 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
12bd0 74 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  te the rollback 
12be0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63  journal.** (whic
12bf0 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
12c00 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
12c10 69 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63  it) and drop loc
12c20 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ks..**.** This w
12c30 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
12c40 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
12c50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
12c60 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
12c70 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
12c80 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
12c90 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
12ca0 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
12cb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12cc0 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29  aseTwo(Btree *p)
12cd0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12ce0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
12cf0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12d00 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
12d10 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49   p->db;.  btreeI
12d20 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
12d30 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
12d40 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
12d50 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
12d60 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
12d70 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
12d80 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
12d90 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
12da0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
12db0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12dc0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
12dd0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
12de0 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
12df0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12e00 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
12e10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12e20 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
12e30 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
12e40 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
12e50 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
12e60 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
12e70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12e80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
12e90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
12ea0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12eb0 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54    }.    pBt->inT
12ec0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
12ed0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74  NS_READ;.    pBt
12ee0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
12ef0 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  }.  unlockAllTab
12f00 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  les(p);..  /* If
12f10 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
12f20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
12f30 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
12f40 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61 6e  crement the tran
12f50 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
12f60 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
12f70 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
12f80 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
12f90 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 0a   reaches 0, set.
12fa0 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64 20    ** the shared 
12fb0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
12fc0 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
12fd0 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20 63  treeIfUnused() c
12fe0 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77  all below.  ** w
12ff0 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
13000 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ager..  */.  if(
13010 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
13020 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70  NS_NONE ){.    p
13030 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
13040 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70  --;.    if( 0==p
13050 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
13060 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
13070 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
13080 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d  RANS_NONE;.    }
13090 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
130a0 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72 65  he handles curre
130b0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
130c0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
130d0 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20  NE and unlock.  
130e0 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66 20  ** the pager if 
130f0 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
13100 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
13110 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
13120 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69  ion..  */.  p->i
13130 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
13140 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  ONE;.  unlockBtr
13150 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
13160 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
13170 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
13180 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
131a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
131b0 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
131c0 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
131d0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
131e0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
131f0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
13200 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
13220 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
13230 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
13240 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13250 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
13260 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
13270 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  wo(p);.  }.  sql
13280 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13290 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
132a0 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
132b0 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
132c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69  he number of wri
132d0 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  te-cursors open 
132e0 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  on this handle. 
132f0 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
13300 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
13310 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
13320 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
13330 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
13340 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
13350 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
13360 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
13370 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d  outine, a write-
13380 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
13390 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
133a0 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69  capable of writi
133b0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73  ng to the databs
133c0 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74  e.  That means t
133d0 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a  he cursor was.**
133e0 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e   originally open
133f0 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ed for writing a
13400 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  nd the cursor ha
13410 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65  s not be disable
13420 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69  d.** by having i
13430 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64  ts state changed
13440 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
13450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13460 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
13470 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  s(BtShared *pBt)
13480 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
13490 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
134a0 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
134b0 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
134c0 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
134d0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
134e0 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d  >wrFlag && pCur-
134f0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
13500 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20  FAULT ) r++; .  
13510 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
13520 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
13530 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
13540 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52  the state to CUR
13550 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68  SOR_FAULT and th
13560 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
13570 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65  to errCode for e
13580 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42  very cursor on B
13590 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74  tShared that pBt
135a0 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ree.** reference
135b0 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  s..**.** Every c
135c0 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64  ursor is tripped
135d0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
135e0 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a  ors that belong.
135f0 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ** to other data
13600 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
13610 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
13620 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68  be sharing.** th
13630 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
13640 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
13650 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
13660 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
13670 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41  ack occurs..** A
13680 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67  ll cursors using
13690 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20   the same cache 
136a0 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a  must be tripped.
136b0 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68  ** to prevent th
136c0 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  em from trying t
136d0 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20  o use the btree 
136e0 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c  after.** the rol
136f0 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c  lback.  The roll
13700 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
13710 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20  leted tables.** 
13720 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61  or moved root pa
13730 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f  ges, so it is no
13740 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a  t sufficient to.
13750 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74  ** save the stat
13760 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e  e of the cursor.
13770 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
13780 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61  t be.** invalida
13790 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
137a0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
137b0 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70  Cursors(Btree *p
137c0 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f  Btree, int errCo
137d0 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  de){.  BtCursor 
137e0 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  *p;.  sqlite3Btr
137f0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
13800 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
13810 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
13820 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
13830 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
13840 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 70  sition(p);.    p
13850 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
13860 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
13870 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a  skip = errCode;.
13880 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
13890 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
138a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
138b0 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
138c0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
138d0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
138e0 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
138f0 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
13900 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
13910 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
13920 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
13930 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
13940 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
13950 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
13960 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
13970 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
13980 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
13990 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
139a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
139b0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
139c0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
139d0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
139e0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
139f0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
13a00 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
13a10 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13a20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
13a30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13a40 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
13a50 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
13a60 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
13a70 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
13a80 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
13a90 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23  rs(pBt, 0, 0);.#
13aa0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13ab0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
13ac0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13ad0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
13ae0 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65  is is a horrible
13af0 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49   situation. An I
13b00 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
13b10 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
13b20 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67  st.    ** trying
13b30 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20   to save cursor 
13b40 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68  positions. If th
13b50 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74  is is an automat
13b60 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a  ic rollback (as.
13b70 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c      ** the resul
13b80 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e  t of a constrain
13b90 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  t, malloc() fail
13ba0 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29  ure or IO error)
13bb0 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   then .    ** th
13bc0 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69  e cache may be i
13bd0 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73  nternally incons
13be0 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74  istent (not cont
13bf0 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29  ain valid trees)
13c00 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61   so.    ** we ca
13c10 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75  nnot simply retu
13c20 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20  rn the error to 
13c30 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74  the caller. Inst
13c40 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20  ead, abort .    
13c50 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74  ** all queries t
13c60 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67  hat may be using
13c70 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73   any of the curs
13c80 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20  ors that failed 
13c90 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a  to save..    */.
13ca0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13cb0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
13cc0 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  , rc);.  }.#endi
13cd0 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  f.  btreeIntegri
13ce0 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41  ty(p);.  unlockA
13cf0 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
13d00 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
13d10 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
13d20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66     int rc2;..#if
13d30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13d40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
13d50 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b  pBt->nTrunc = 0;
13d60 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
13d70 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
13d80 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
13d90 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
13da0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
13db0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
13dc0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
13dd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13de0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
13df0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
13e00 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
13e10 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
13e20 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
13e30 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
13e40 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72   call sqlite3Btr
13e50 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
13e60 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
13e70 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
13e80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
13e90 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
13ea0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
13eb0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
13ec0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
13ed0 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
13ee0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
13ef0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
13f00 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
13f10 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
13f20 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
13f30 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13f40 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
13f50 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e    }..  if( p->in
13f60 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
13f70 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
13f80 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
13f90 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  on>0 );.    pBt-
13fa0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
13fb0 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
13fc0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
13fd0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
13fe0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
13ff0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
14000 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  }..  p->inTrans 
14010 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
14020 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
14030 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  .  unlockBtreeIf
14040 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20  Unused(pBt);..  
14050 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
14060 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
14070 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14080 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14090 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
140a0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
140b0 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e 73  n.  The subtrans
140c0 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61  action can.** ca
140d0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
140e0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
140f0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
14100 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d  action..** You m
14110 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
14120 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 73  saction before s
14130 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
14140 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
14150 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
14160 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
14170 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d 61  ically if the ma
14180 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  in transaction.*
14190 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  * commits or rol
141a0 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  ls back..**.** O
141b0 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e 73  nly one subtrans
141c0 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
141d0 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e 20  tive at a time. 
141e0 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
141f0 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61  to try.** to sta
14200 72 74 20 61 20 6e 65 77 20 73 75 62 74 72 61 6e  rt a new subtran
14210 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68  saction if anoth
14220 65 72 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  er subtransactio
14230 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
14240 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ive..**.** State
14250 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
14260 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
14270 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
14280 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
14290 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
142a0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
142b0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
142c0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
142d0 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
142e0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
142f0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
14300 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
14310 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
14320 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
14330 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
14340 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
14350 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
14360 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
14370 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
14380 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
14390 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
143a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
143b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
143c0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
143d0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
143e0 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  ( (p->inTrans!=T
143f0 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
14400 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20  Bt->inStmt ){.  
14410 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
14420 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
14430 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
14440 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
14450 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
14460 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
14470 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
14480 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
14490 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f  dOnly ? SQLITE_O
144a0 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65 72  K : sqlite3Pager
144b0 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e 70  StmtBegin(pBt->p
144c0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d  Pager);.    pBt-
144d0 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
144e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
144f0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14500 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
14510 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74 6d  Commit the statm
14520 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
14530 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
14540 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e 6f  progress.  If no
14550 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74 69  .** subtransacti
14560 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74 68  on is active, th
14570 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
14580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14590 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72  eeCommitStmt(Btr
145a0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
145b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
145c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
145d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
145e0 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
145f0 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74  p->db;.  if( pBt
14600 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74  ->inStmt && !pBt
14610 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
14620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14630 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42  gerStmtCommit(pB
14640 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  t->pPager);.  }e
14650 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
14660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
14670 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
14680 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14690 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
146a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
146b0 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  llback the activ
146c0 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  e statement subt
146d0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
146e0 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  no subtransactio
146f0 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20 74  n.** is active t
14700 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14710 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c   no-op..**.** Al
14720 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
14730 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  e invalidated by
14740 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
14750 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a    Any attempt.**
14760 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
14770 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61   that was open a
14780 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
14790 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  of this operatio
147a0 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74  n.** will result
147b0 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f   in an error..*/
147c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
147d0 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74  eRollbackStmt(Bt
147e0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
147f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14800 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14810 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
14820 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14830 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
14840 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  db;.  if( pBt->i
14850 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
14860 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
14870 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14880 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74  StmtRollback(pBt
14890 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  ->pPager);.    p
148a0 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
148b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
148c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
148d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
148e0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
148f0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
14900 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
14910 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
14920 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63   iTable.  The ac
14930 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61  t of acquiring a
14940 20 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72   cursor gets a r
14950 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  ead lock on .** 
14960 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14970 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  e..**.** If wrFl
14980 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
14990 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
149a0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
149b0 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
149c0 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
149d0 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
149e0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
149f0 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
14a00 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
14a10 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
14a20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
14a30 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
14a40 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
14a50 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
14a60 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
14a70 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
14a80 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
14a90 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
14aa0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
14ab0 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
14ac0 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
14ad0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14ae0 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
14af0 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
14b00 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
14b10 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
14b20 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
14b30 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
14b40 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
14b50 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
14b60 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
14b70 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
14b80 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
14b90 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
14ba0 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
14bb0 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
14bc0 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
14bd0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
14be0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
14bf0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
14c00 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
14c10 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
14c20 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
14c30 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
14c40 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
14c50 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
14c60 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
14c70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
14c80 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
14c90 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
14ca0 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
14cb0 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
14cc0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
14cd0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
14ce0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
14cf0 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
14d00 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
14d10 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
14d20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
14d30 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14d60 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
14d70 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d90 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
14da0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
14db0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
14dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14de0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
14df0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
14e00 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
14e10 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
14e20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
14e30 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
14e40 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
14e50 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e70 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
14e80 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
14e90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
14ea0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14eb0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
14ec0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
14ed0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
14ee0 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20  if( wrFlag ){.  
14ef0 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
14f00 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nly ){.      ret
14f10 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
14f20 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
14f30 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
14f40 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20  s(p, iTable, 0, 
14f50 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
14f60 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
14f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
14f80 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
14f90 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  0 ){.    rc = lo
14fa0 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
14fb0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  (p);.    if( rc!
14fc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14fd0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14fe0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
14ff0 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72  ->readOnly && wr
15000 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 72 65  Flag ){.      re
15010 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
15020 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
15030 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
15040 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
15050 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
15060 20 26 26 20 70 61 67 65 72 50 61 67 65 63 6f 75   && pagerPagecou
15070 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
15080 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
15090 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20  QLITE_EMPTY;.   
150a0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
150b0 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
150c0 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
150d0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
150e0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
150f0 43 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a  Cur->pPage, 0);.
15100 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15110 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
15120 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
15130 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ception;.  }..  
15140 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
15150 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
15160 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
15170 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
15180 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
15190 62 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63  bles, link the c
151a0 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
151b0 74 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64  tShared list and
151c0 20 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65   set *ppCur (the
151d0 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67  .  ** output arg
151e0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
151f0 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20  nction)..  */.  
15200 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
15210 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
15220 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
15230 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
15240 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
15250 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75   = wrFlag;.  pCu
15260 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
15270 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
15280 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
15290 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
152a0 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
152b0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
152c0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
152d0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
152e0 49 4e 56 41 4c 49 44 3b 0a 0a 20 20 72 65 74 75  INVALID;..  retu
152f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63  rn SQLITE_OK;..c
15300 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
15310 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73  eption:.  releas
15320 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
15330 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  e);.  unlockBtre
15340 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
15350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
15360 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
15370 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
15380 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
153b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
153c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153e0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
153f0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
15400 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
15410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
15440 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
15450 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
15460 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15480 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
15490 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
154a0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
154d0 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
154e0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
154f0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
15500 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
15510 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
15520 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
15530 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
15540 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
15550 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
15560 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
15580 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
15590 75 72 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20 72  ursorSize(){.  r
155a0 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43  eturn sizeof(BtC
155b0 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ursor);.}..../*.
155c0 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
155d0 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
155e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
155f0 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
15600 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
15610 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
15620 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
15630 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
15640 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
15650 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
15660 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
15670 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
15680 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  ee ){.    BtShar
15690 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
156a0 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
156b0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
156c0 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  e);.    pBt->db 
156d0 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  = pBtree->db;.  
156e0 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73    clearCursorPos
156f0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
15700 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
15710 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
15720 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
15730 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
15740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
15750 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
15760 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
15770 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
15780 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
15790 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
157a0 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
157b0 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50    }.    releaseP
157c0 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
157d0 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
157e0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
157f0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
15800 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
15810 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
15820 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
15830 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
15840 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
15850 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15860 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15870 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72   Make a temporar
15880 79 20 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c  y cursor by fill
15890 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64  ing in the field
158a0 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a  s of pTempCur..*
158b0 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * The temporary 
158c0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e  cursor is not on
158d0 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74   the cursor list
158e0 20 66 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a   for the Btree..
158f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
15900 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f  treeGetTempCurso
15910 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
15920 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d  , BtCursor *pTem
15930 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
15940 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15950 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d  x(pCur) );.  mem
15960 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43  cpy(pTempCur, pC
15970 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  ur, sizeof(*pCur
15980 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e  ));.  pTempCur->
15990 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65  pNext = 0;.  pTe
159a0 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30  mpCur->pPrev = 0
159b0 3b 0a 20 20 69 66 28 20 70 54 65 6d 70 43 75 72  ;.  if( pTempCur
159c0 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73  ->pPage ){.    s
159d0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
159e0 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  TempCur->pPage->
159f0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
15a00 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
15a10 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
15a20 20 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64   such as was mad
15a30 65 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54  e by the CreateT
15a40 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29  emporaryCursor()
15a50 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f  .** function abo
15a60 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ve..*/.void sqli
15a70 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54  te3BtreeReleaseT
15a80 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
15a90 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
15aa0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
15ab0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
15ac0 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65   if( pCur->pPage
15ad0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
15ae0 61 67 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e  agerUnref(pCur->
15af0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
15b00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
15b10 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
15b20 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
15b30 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
15b40 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
15b50 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
15b60 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
15b70 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
15b80 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33   call.** sqlite3
15b90 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
15ba0 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
15bb0 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
15bc0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
15bd0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
15be0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
15bf0 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
15c00 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
15c10 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
15c20 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
15c30 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
15c40 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36  )..**.** 2007-06
15c50 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61  -25:  There is a
15c60 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72   bug in some ver
15c70 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68  sions of MSVC th
15c80 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20  at cause the.** 
15c90 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73  compiler to cras
15ca0 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e  h when getCellIn
15cb0 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e  fo() is implemen
15cc0 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a  ted as a macro..
15cd0 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20  ** But there is 
15ce0 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70  a measureable sp
15cf0 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f  eed advantage to
15d00 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f   using the macro
15d10 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e   on gcc.** (when
15d20 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f   less compiler o
15d30 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b  ptimizations lik
15d40 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65  e -Os or -O0 are
15d50 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
15d60 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74   compiler is not
15d70 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65   doing agressive
15d80 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20   inlining.)  So 
15d90 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75  we use a real fu
15da0 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53  nction.** for MS
15db0 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66  VC and a macro f
15dc0 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  or everything el
15dd0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35  se.  Ticket #245
15de0 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  7..*/.#ifndef ND
15df0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
15e00 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
15e10 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
15e20 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
15e30 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  info;.    memset
15e40 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
15e50 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71  f(info));.    sq
15e60 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
15e70 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
15e80 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66   pCur->idx, &inf
15e90 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
15ea0 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
15eb0 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
15ec0 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
15ed0 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
15ee0 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
15ef0 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  o(x).#endif.#ifd
15f00 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a  ef _MSC_VER.  /*
15f10 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   Use a real func
15f20 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20  tion in MSVC to 
15f30 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73  work around bugs
15f40 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65   in that compile
15f50 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  r. */.  static v
15f60 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
15f70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15f80 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
15f90 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
15fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
15fb0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
15fc0 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  ->pPage, pCur->i
15fd0 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dx, &pCur->info)
15fe0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
15ff0 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
16000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
16010 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
16020 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
16030 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
16040 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
16050 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
16060 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
16070 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
16080 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
16090 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
160a0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
160e0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
160f0 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c         \.    sql
16130 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
16140 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  ll(pCur->pPage, 
16150 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72  pCur->idx, &pCur
16160 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20  ->info);        
16170 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c   \.    pCur->val
16180 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20  idNKey = 1;     
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
161c0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
16210 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
16250 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
16260 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a  MSC_VER */../*.*
16270 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
16280 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
16290 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
162a0 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
162b0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
162c0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
162d0 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
162e0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
162f0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
16300 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
16310 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
16320 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
16330 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
16340 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
16350 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
16360 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
16370 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
16380 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
16390 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
163a0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
163b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
163c0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
163d0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
163e0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
163f0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
16400 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
16410 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
16420 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
16440 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
16450 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
16460 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
16470 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
16480 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
16490 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
164a0 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
164b0 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  *pSize = 0;.    
164c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74  }else{.      get
164d0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
164e0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70        *pSize = p
164f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
16500 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
16510 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16520 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
16530 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16540 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
16550 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
16560 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
16570 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61 79  oints to.  Alway
16580 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  s return SQLITE_
16590 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  OK..** Failure i
165a0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
165b0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
165c0 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 0a  s not currently.
165d0 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ** pointing to a
165e0 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20 63  n entry (which c
165f0 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65  an happen, for e
16600 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74 68  xample, if.** th
16610 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d  e database is em
16620 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a 65  pty) then *pSize
16630 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
16640 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16650 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
16660 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
16670 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
16680 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
16690 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
166a0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
166b0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
166c0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
166d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
166e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
166f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16700 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
16710 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16720 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
16730 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
16740 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
16750 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
16760 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
16770 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
16780 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
16790 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
167a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
167b0 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
167c0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
167d0 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
167e0 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  nData;.    }.  }
167f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16800 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
16810 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16820 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
16830 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
16840 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
16850 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
16860 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
16870 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
16880 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
16890 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
168a0 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
168b0 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
168c0 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
168d0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
168e0 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
168f0 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
16900 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
16910 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
16920 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
16930 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
16940 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
16950 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
16960 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
16970 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78   Unless pPgnoNex
16980 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70  t is NULL, the p
16990 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
169a0 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
169b0 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20  .** page in the 
169c0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77  linked list is w
169d0 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
169e0 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
169f0 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  fl.** is the las
16a00 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
16a10 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e  nked list, *pPgn
16a20 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
16a30 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
16a40 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
16a50 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73  LL, *ppPage is s
16a60 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  et to the MemPag
16a70 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72  e* handle.** for
16a80 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20   page ovfl. The 
16a90 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72  underlying pager
16aa0 20 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62   page may have b
16ab0 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  een requested.**
16ac0 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74   with the noCont
16ad0 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f  ent flag set, so
16ae0 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61   the page data a
16af0 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a  ccessable via.**
16b00 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79   this handle may
16b10 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e   not be trusted.
16b20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
16b30 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
16b40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
16b50 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20   .  Pgno ovfl,  
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b70 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
16b80 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
16b90 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
16ba0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
16bb0 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  age handle */.  
16bc0 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16be0 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
16bf0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
16c00 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
16c10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
16c20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16c30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
16c40 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
16c50 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73 65 20 6d  * One of these m
16c60 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e  ust not be NULL.
16c70 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 79 20   Otherwise, why 
16c80 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
16c90 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on? */.  assert(
16ca0 70 70 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f 4e  ppPage || pPgnoN
16cb0 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ext);..  /* If p
16cc0 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c  PgnoNext is NULL
16cd0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
16ce0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
16cf0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a 20  lled to obtain. 
16d00 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20 72   ** a MemPage* r
16d10 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e  eference only. N
16d20 6f 20 70 61 67 65 2d 64 61 74 61 20 69 73 20 72  o page-data is r
16d30 65 71 75 69 72 65 64 20 69 6e 20 74 68 69 73 20  equired in this 
16d40 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
16d50 20 21 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20   !pPgnoNext ){. 
16d60 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
16d70 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
16d80 74 2c 20 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c  t, ovfl, ppPage,
16d90 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   1);.  }..#ifnde
16da0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16db0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
16dc0 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
16dd0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
16de0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
16df0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
16e00 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
16e10 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
16e20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
16e30 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
16e40 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
16e50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
16e60 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
16e70 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
16e80 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
16e90 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
16ea0 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
16eb0 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
16ec0 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
16ed0 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
16ee0 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
16ef0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
16f00 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
16f10 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
16f20 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
16f30 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
16f40 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
16f50 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16f60 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
16f70 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
16f80 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
16f90 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
16fa0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
16fb0 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  ess<=pagerPageco
16fc0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
16fd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
16fe0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
16ff0 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
17000 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
17010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17020 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17030 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17040 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
17050 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
17060 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
17070 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
17080 75 65 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uess;.      }.  
17090 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
170a0 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c    if( next==0 ||
170b0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d   ppPage ){.    M
170c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
170d0 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
170e0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
170f0 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
17100 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20  ge, next!=0);.  
17110 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
17120 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
17130 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  =0);.    if( nex
17140 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  t==0 && rc==SQLI
17150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
17160 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
17170 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
17180 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50    }..    if( ppP
17190 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  age ){.      *pp
171a0 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
171b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
171c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
171d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
171e0 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
171f0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
17200 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
17210 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
17220 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
17230 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
17240 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
17250 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
17260 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
17270 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
17280 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
17290 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
172a0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
172b0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
172c0 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
172d0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
172e0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
172f0 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
17300 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
17310 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
17320 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
17330 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
17340 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
17350 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
17360 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
17370 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
17380 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
17390 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
173a0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
173b0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
173c0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
173d0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
173e0 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
173f0 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
17400 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
17410 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
17420 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
17430 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17440 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
17450 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17470 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17480 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
17490 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
174a0 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
174b0 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
174c0 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
174d0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
174e0 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
174f0 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
17500 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
17510 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
17520 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
17530 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
17540 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
17550 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
17560 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
17570 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
17580 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
17590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
175a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
175b0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
175c0 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
175d0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
175e0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
175f0 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
17600 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
17610 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
17620 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
17630 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
17640 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17650 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
17660 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17670 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
17680 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
17690 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
176a0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
176b0 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
176c0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
176d0 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
176e0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
176f0 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
17700 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
17710 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
17720 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
17730 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
17740 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
17750 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
17760 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
17770 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
17780 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
17790 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
177a0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
177b0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
177c0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
177d0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
177e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
177f0 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
17800 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
17810 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
17820 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
17830 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
17840 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
17850 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
17860 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
17870 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
17880 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
17890 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
178a0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
178b0 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
178c0 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
178d0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
178e0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
178f0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
17900 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
17910 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
17920 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
17930 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
17940 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
17950 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
17960 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
17970 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
17980 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
17990 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
179a0 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
179b0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
179c0 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
179d0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
179e0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
179f0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
17a00 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
17a10 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
17a20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
17a30 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
17a40 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
17a50 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
17a60 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
17a70 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
17a80 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
17a90 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
17aa0 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
17ab0 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
17ac0 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
17ad0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
17ae0 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
17af0 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
17b00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
17b10 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
17b20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
17b30 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
17b40 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
17b50 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
17b60 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
17b70 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
17b80 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
17b90 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
17ba0 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
17bb0 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
17bc0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
17bd0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
17be0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
17bf0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
17c00 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  om */.  int offs
17c10 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
17c20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
17c30 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
17c40 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  oad */.  int amt
17c50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
17c60 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
17c70 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
17c80 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
17c90 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
17ca0 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
17cb0 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
17cc0 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
17cd0 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
17ce0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
17cf0 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
17d00 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
17d10 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
17d20 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
17d30 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
17d40 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
17d50 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
17d60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
17d70 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
17d80 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
17d90 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
17da0 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20  ->pPage;     /* 
17db0 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
17dc0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
17dd0 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
17de0 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
17df0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
17e00 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65  e this cursor be
17e10 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
17e20 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
17e30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
17e40 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
17e50 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
17e60 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
17e70 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
17e80 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
17e90 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
17ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
17eb0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
17ec0 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
17ed0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
17ee0 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
17ef0 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
17f00 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
17f10 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
17f20 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70  ->intKey ? 0 : p
17f30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b  Cur->info.nKey);
17f40 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  ..  if( skipKey 
17f50 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  ){.    offset +=
17f60 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28   nKey;.  }.  if(
17f70 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b   offset+amt > nK
17f80 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
17f90 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ata ){.    /* Tr
17fa0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
17fb0 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
17fc0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
17fd0 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
17fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17ff0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
18000 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
18010 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
18020 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
18030 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
18040 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
18050 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
18060 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
18070 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
18080 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
18090 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
180a0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
180b0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
180c0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
180d0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
180e0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
180f0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
18100 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
18110 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
18120 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
18130 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
18140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
18150 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
18160 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
18170 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
18180 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18190 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
181a0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f  .    const int o
181b0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
181c0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
181d0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
181e0 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
181f0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
18200 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
18210 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
18220 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
18230 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
18240 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18250 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
18260 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
18270 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
18280 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
18290 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
182a0 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
182b0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
182c0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
182d0 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
182e0 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
182f0 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
18300 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
18310 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
18320 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
18330 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
18340 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
18350 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
18360 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
18370 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
18380 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
18390 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
183a0 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
183b0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
183c0 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
183d0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
183e0 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
183f0 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
18400 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
18410 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
18420 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
18430 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
18440 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
18450 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
18460 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
18470 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
18480 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
18490 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
184a0 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
184b0 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66  nOvfl);.      if
184c0 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72  ( nOvfl && !pCur
184d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
184e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
184f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18500 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
18510 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
18520 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
18530 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
18540 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
18550 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
18560 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
18570 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
18580 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
18590 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
185a0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
185b0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
185c0 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
185d0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
185e0 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
185f0 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
18600 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
18610 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
18620 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
18630 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
18640 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
18650 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
18660 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
18670 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
18680 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
18690 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65  iIdx++){..#ifnde
186a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
186b0 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20  CRBLOB.      /* 
186c0 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
186d0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
186e0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
186f0 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
18700 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18710 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
18720 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
18730 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
18740 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
18750 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
18760 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
18770 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
18780 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
18790 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
187a0 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
187b0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
187c0 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
187d0 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
187e0 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
187f0 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
18800 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
18810 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
18820 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
18830 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
18840 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
18850 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
18860 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
18870 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
18880 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
18890 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
188a0 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
188b0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
188c0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
188d0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
188e0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  on..        */.#
188f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18900 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
18910 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
18920 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
18930 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
18940 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
18950 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
18960 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
18970 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1];.        } el
18980 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
18990 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
189a0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
189b0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
189c0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
189d0 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
189e0 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
189f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
18a00 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
18a10 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
18a20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
18a30 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
18a40 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
18a50 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
18a60 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
18a70 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
18a80 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18a90 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
18aa0 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e;.        int a
18ab0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
18ac0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18ad0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
18ae0 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
18af0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
18b00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50   ){.          aP
18b20 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
18b30 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
18b40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
18b50 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
18b60 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
18b70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20            if( a 
18b80 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
18b90 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
18ba0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
18bb0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
18bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18bd0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
18be0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
18bf0 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
18c00 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
18c10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
18c20 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
18c30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66  e);.          of
18c40 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
18c50 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
18c60 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
18c70 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
18c80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
18c90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18ca0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
18cb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18cc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18cd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
18cf0 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
18d00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
18d10 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
18d20 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
18d30 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
18d40 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
18d50 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
18d60 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
18d70 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
18d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18d90 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
18da0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
18db0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
18dc0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
18dd0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
18de0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
18df0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
18e00 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
18e10 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
18e20 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
18e30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
18e40 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
18e50 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
18e60 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
18e70 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
18e80 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
18e90 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
18ea0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
18eb0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18ec0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
18ed0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
18ee0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
18ef0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18f00 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
18f10 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
18f20 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
18f30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18f40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18f50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
18f60 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
18f70 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
18f80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
18f90 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
18fa0 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  idx<pCur->pPage-
18fb0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
18fc0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
18fd0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
18fe0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
18ff0 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b  ar*)pBuf, 0, 0);
19000 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
19020 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
19030 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
19040 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
19050 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
19060 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
19070 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
19080 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
19090 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
190a0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
190b0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
190c0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
190d0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
190e0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
190f0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
19100 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
19110 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
19120 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
19130 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
19140 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
19150 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
19160 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19170 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
19180 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
19190 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
191a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
191b0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28  _INCRBLOB.  if (
191c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
191d0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
191e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
191f0 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
19200 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
19210 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19220 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
19230 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
19240 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
19250 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19260 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
19270 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
19280 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
19290 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
192a0 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20  >pPage!=0 );.   
192b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
192c0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
192d0 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  dx<pCur->pPage->
192e0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
192f0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
19300 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
19310 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a  t, pBuf, 1, 0);.
19320 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19340 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
19350 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
19360 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
19370 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
19380 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
19390 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
193a0 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
193b0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
193c0 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70   the key if skip
193d0 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f  Key==0 and it po
193e0 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69  ints to the begi
193f0 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66  nning of data if
19400 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20  .** skipKey==1. 
19410 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
19420 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
19430 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  e key/data is wr
19440 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
19450 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
19460 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
19470 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
19480 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69  not be.** a vali
19490 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
194a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
194b0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
194c0 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
194d0 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
194e0 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
194f0 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
19500 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
19510 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
19520 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
19530 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
19540 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
19550 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
19560 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
19570 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
19580 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
19590 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
195a0 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
195b0 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
195c0 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
195d0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
195e0 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
195f0 61 73 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20  assembly.** the 
19600 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
19610 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
19620 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
19630 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
19640 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
19650 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
19660 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
19670 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
19680 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
19690 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
196a0 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
196b0 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
196c0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
196d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
196e0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
196f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19700 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
19710 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19720 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
19730 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
19740 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
19750 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
19760 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
19770 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
19780 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
19790 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
197a0 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
197b0 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
197c0 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
197d0 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
197e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
197f0 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
19800 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
19810 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f   nKey;.  int nLo
19820 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
19830 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
19840 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  >pPage!=0 );.  a
19850 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19860 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19870 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  D );.  assert( c
19880 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19890 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65  pCur) );.  pPage
198a0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
198b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
198c0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
198d0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
198e0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
198f0 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
19900 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
19910 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
19920 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
19930 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
19940 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
19950 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
19960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
19970 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
19980 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b  ey;.  }.  if( sk
19990 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61  ipKey ){.    aPa
199a0 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20  yload += nKey;. 
199b0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
199c0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
199d0 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nKey;.  }else{. 
199e0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
199f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
19a00 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b     if( nLocal>nK
19a10 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63  ey ){.      nLoc
19a20 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d  al = nKey;.    }
19a30 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e  .  }.  *pAmt = n
19a40 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
19a50 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  aPayload;.}.../*
19a60 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
19a70 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
19a80 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
19a90 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
19aa0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
19ab0 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
19ac0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
19ad0 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
19ae0 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
19af0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
19b00 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
19b10 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
19b20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
19b30 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
19b40 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
19b50 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
19b60 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
19b70 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
19b80 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
19b90 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
19ba0 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
19bb0 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
19bc0 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
19bd0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
19be0 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
19bf0 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
19c00 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
19c10 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
19c20 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
19c30 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
19c40 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
19c50 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
19c60 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
19c70 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
19c80 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
19c90 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
19ca0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
19cb0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
19cc0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
19cd0 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
19ce0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19cf0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19d00 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
19d10 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
19d20 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
19d30 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
19d40 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
19d50 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20   pAmt, 0);.  }. 
19d60 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e   return 0;.}.con
19d70 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
19d80 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
19d90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
19da0 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73  nt *pAmt){.  ass
19db0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19dc0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
19dd0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
19de0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19df0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63  ){.    return (c
19e00 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
19e10 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
19e20 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 1);.  }.  re
19e30 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
19e40 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
19e50 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
19e60 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
19e70 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
19e80 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
19e90 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
19ea0 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
19eb0 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e to..*/.static 
19ec0 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
19ed0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19ee0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
19ef0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
19f00 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d  e *pNewPage;.  M
19f10 65 6d 50 61 67 65 20 2a 70 4f 6c 64 50 61 67 65  emPage *pOldPage
19f20 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
19f30 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
19f40 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
19f50 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
19f60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
19f70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19f80 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63  OR_VALID );.  rc
19f90 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
19fa0 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
19fb0 26 70 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d  &pNewPage, pCur-
19fc0 3e 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  >pPage);.  if( r
19fd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
19fe0 20 70 4e 65 77 50 61 67 65 2d 3e 69 64 78 50 61   pNewPage->idxPa
19ff0 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64 78  rent = pCur->idx
1a000 3b 0a 20 20 70 4f 6c 64 50 61 67 65 20 3d 20 70  ;.  pOldPage = p
1a010 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f  Cur->pPage;.  pO
1a020 6c 64 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74  ldPage->idxShift
1a030 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
1a040 61 67 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20  age(pOldPage);. 
1a050 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70   pCur->pPage = p
1a060 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
1a070 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  >idx = 0;.  pCur
1a080 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1a090 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1a0a0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Key = 0;.  if( p
1a0b0 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31  NewPage->nCell<1
1a0c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1a0d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1a0e0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
1a0f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a100 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1a110 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1a120 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
1a130 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a   of its table..*
1a140 2a 0a 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c  *.** The virtual
1a150 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68   root page is th
1a160 65 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20  e root page for 
1a170 6d 6f 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75  most tables.  Bu
1a180 74 0a 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62  t.** for the tab
1a190 6c 65 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67  le rooted on pag
1a1a0 65 20 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68  e 1, sometime th
1a1b0 65 20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65  e real root page
1a1c0 0a 2a 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63  .** is empty exc
1a1d0 65 70 74 20 66 6f 72 20 74 68 65 20 72 69 67 68  ept for the righ
1a1e0 74 2d 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73  t-pointer.  In s
1a1f0 75 63 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a  uch cases the.**
1a200 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
1a210 67 65 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ge is the page t
1a220 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f  hat the right-po
1a230 69 6e 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a  inter of page.**
1a240 20 31 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74   1 is pointing t
1a250 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
1a260 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65  3BtreeIsRootPage
1a270 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1a280 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
1a290 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  rent;..  assert(
1a2a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1a2b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1a2c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 72  mutex) );.  pPar
1a2d0 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61  ent = pPage->pPa
1a2e0 72 65 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72  rent;.  if( pPar
1a2f0 65 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ent==0 ) return 
1a300 31 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  1;.  if( pParent
1a310 2d 3e 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72  ->pgno>1 ) retur
1a320 6e 20 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62  n 0;.  if( get2b
1a330 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
1a340 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
1a350 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20  Offset+3])==0 ) 
1a360 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1a370 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rn 0;.}../*.** M
1a380 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
1a390 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
1a3a0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
1a3b0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1a3c0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
1a3d0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
1a3e0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
1a3f0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
1a400 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
1a410 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
1a420 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
1a430 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
1a440 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
1a450 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
1a460 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
1a470 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
1a480 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a490 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1a4a0 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
1a4b0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
1a4c0 50 61 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67  Parent;.  MemPag
1a4d0 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
1a4e0 69 64 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73  idxParent;..  as
1a4f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a500 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a510 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1a520 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1a530 41 4c 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20  ALID );.  pPage 
1a540 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1a550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21 3d   assert( pPage!=
1a560 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  0 );.  assert( !
1a570 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
1a580 6f 74 50 61 67 65 28 70 50 61 67 65 29 20 29 3b  otPage(pPage) );
1a590 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61  .  pParent = pPa
1a5a0 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61  ge->pParent;.  a
1a5b0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
1a5c0 30 20 29 3b 0a 20 20 69 64 78 50 61 72 65 6e 74  0 );.  idxParent
1a5d0 20 3d 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72   = pPage->idxPar
1a5e0 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ent;.  sqlite3Pa
1a5f0 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e  gerRef(pParent->
1a600 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  pDbPage);.  rele
1a610 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
1a620 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1a630 70 50 61 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d  pParent;.  pCur-
1a640 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1a650 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1a660 65 79 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ey = 0;.  assert
1a670 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68  ( pParent->idxSh
1a680 69 66 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  ift==0 );.  pCur
1a690 2d 3e 69 64 78 20 3d 20 69 64 78 50 61 72 65 6e  ->idx = idxParen
1a6a0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  t;.}../*.** Move
1a6b0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1a6c0 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a  he root page.*/.
1a6d0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a6e0 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
1a6f0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
1a700 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
1a710 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a720 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
1a730 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
1a740 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1a750 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
1a760 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1a770 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1a780 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
1a790 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
1a7a0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
1a7b0 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
1a7c0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
1a7d0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
1a7e0 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
1a7f0 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
1a800 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
1a810 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
1a820 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1a830 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
1a840 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a850 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
1a860 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
1a870 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  kip;.    }.    c
1a880 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1a890 6f 6e 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  on(pCur);.  }.  
1a8a0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50  pRoot = pCur->pP
1a8b0 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  age;.  if( pRoot
1a8c0 20 26 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d   && pRoot->pgno=
1a8d0 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
1a8e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a8f0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Root->isInit );.
1a900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1a910 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
1a920 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49  K!=(rc = getAndI
1a930 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
1a940 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  r->pgnoRoot, &pR
1a950 6f 6f 74 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a  oot, 0)).    ){.
1a960 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1a970 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1a980 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
1a990 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1a9a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1a9b0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  ->pPage);.    pC
1a9c0 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f  ur->pPage = pRoo
1a9d0 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  t;.  }.  pCur->i
1a9e0 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  dx = 0;.  pCur->
1a9f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1aa00 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
1aa10 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1aa20 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
1aa30 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30   pRoot->nCell==0
1aa40 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66   && !pRoot->leaf
1aa50 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
1aa60 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74  page;.    assert
1aa70 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pRoot->pgno==1
1aa80 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20   );.    subpage 
1aa90 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
1aaa0 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
1aab0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1aac0 20 20 20 61 73 73 65 72 74 28 20 73 75 62 70 61     assert( subpa
1aad0 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72  ge>0 );.    pCur
1aae0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1aaf0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
1ab00 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1ab10 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
1ab20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
1ab30 20 3d 20 28 28 70 43 75 72 2d 3e 70 50 61 67 65   = ((pCur->pPage
1ab40 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
1ab50 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
1ab60 4e 56 41 4c 49 44 29 3b 0a 20 20 72 65 74 75 72  NVALID);.  retur
1ab70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1ab80 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1ab90 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
1aba0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
1abb0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
1abc0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
1abd0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1abe0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
1abf0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
1ac00 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
1ac10 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
1ac20 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
1ac30 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
1ac40 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1ac50 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
1ac60 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1ac70 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
1ac80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ac90 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
1aca0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
1acb0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1acc0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1acd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1ace0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1acf0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
1ad00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
1ad10 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  (pPage = pCur->p
1ad20 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  Page)->leaf ){. 
1ad30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ad40 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
1ad50 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
1ad60 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
1ad70 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
1ad80 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
1ad90 64 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  dx));.    rc = m
1ada0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1adb0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
1adc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1add0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1ade0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
1adf0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
1ae00 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
1ae10 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
1ae20 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
1ae30 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
1ae40 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
1ae50 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
1ae60 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
1ae70 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
1ae80 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
1ae90 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1aea0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
1aeb0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1aec0 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
1aed0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1aee0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
1aef0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
1af00 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
1af10 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
1af20 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
1af30 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
1af40 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
1af50 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
1af60 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
1af70 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
1af80 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
1af90 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
1afa0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
1afb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1afc0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
1afd0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
1afe0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1aff0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1b000 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1b010 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b020 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
1b030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b040 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
1b050 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
1b060 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
1b070 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1b080 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1b090 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
1b0a0 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e  ->idx = pPage->n
1b0b0 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
1b0c0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1b0d0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
1b0e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b0f0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78  ){.    pCur->idx
1b100 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   = pPage->nCell 
1b110 2d 20 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  - 1;.    pCur->i
1b120 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1b130 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1b140 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
1b150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b160 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1b170 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
1b180 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1b190 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
1b1a0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
1b1b0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
1b1c0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
1b1d0 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
1b1e0 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
1b1f0 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
1b200 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
1b210 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
1b220 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b230 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
1b240 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1b250 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
1b260 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1b270 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1b280 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1b290 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1b2a0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1b2b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1b2c0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1b2d0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1b2e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b2f0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1b300 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1b310 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b320 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1b330 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
1b340 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1b350 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b360 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b370 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1b380 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20  >pPage->nCell>0 
1b390 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1b3a0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
1b3b0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
1b3c0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
1b3d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b3e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1b3f0 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
1b400 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
1b410 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1b420 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
1b430 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
1b440 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
1b450 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
1b460 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
1b470 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
1b480 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
1b490 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
1b4a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
1b4b0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1b4c0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1b4d0 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
1b4e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1b4f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1b500 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b510 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1b520 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1b530 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
1b540 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
1b550 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b560 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
1b570 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1b580 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1b590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1b5a0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
1b5b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
1b5c0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
1b5d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1b5e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b5f0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1b600 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1b610 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
1b620 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1b630 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1b640 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1b650 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
1b660 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  c==SQLITE_OK;.  
1b670 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1b680 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
1b690 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
1b6a0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1b6b0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
1b6c0 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
1b6d0 69 65 64 20 62 79 20 70 4b 65 79 2f 6e 4b 65 79  ied by pKey/nKey
1b6e0 2f 70 55 6e 4b 65 79 2e 20 52 65 74 75 72 6e 20  /pUnKey. Return 
1b6f0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
1b700 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
1b710 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68   tables, only th
1b720 65 20 6e 4b 65 79 20 70 61 72 61 6d 65 74 65 72  e nKey parameter
1b730 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
1b740 0a 2a 2a 20 61 6e 64 20 70 55 6e 4b 65 79 20 6d  .** and pUnKey m
1b750 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
1b760 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
1b770 65 69 74 68 65 72 20 70 55 6e 4b 65 79 0a 2a 2a  either pUnKey.**
1b780 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
1b790 20 6b 65 79 20 74 68 61 74 20 68 61 73 20 61 6c   key that has al
1b7a0 72 65 61 64 79 20 62 65 65 6e 20 75 6e 70 61 63  ready been unpac
1b7b0 6b 65 64 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20  ked, or else.** 
1b7c0 70 4b 65 79 2f 6e 4b 65 79 20 64 65 73 63 72 69  pKey/nKey descri
1b7d0 62 65 73 20 61 20 62 6c 6f 62 20 63 6f 6e 74 61  bes a blob conta
1b7e0 69 6e 69 6e 67 20 74 68 65 20 6b 65 79 2e 0a 2a  ining the key..*
1b7f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
1b800 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
1b810 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
1b820 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
1b830 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
1b840 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
1b850 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
1b860 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
1b870 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
1b880 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
1b890 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
1b8a0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
1b8b0 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
1b8c0 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
1b8d0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
1b8e0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
1b8f0 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
1b900 20 74 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a   to which the.**
1b910 20 63 75 72 73 6f 72 20 69 73 20 77 72 69 74 74   cursor is writt
1b920 65 6e 20 74 6f 20 2a 70 52 65 73 20 69 66 20 70  en to *pRes if p
1b930 52 65 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20  Res!=NULL.  The 
1b940 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  meaning of.** th
1b950 69 73 20 76 61 6c 75 65 20 69 73 20 61 73 20 66  is value is as f
1b960 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1b970 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
1b980 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
1b990 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1b9a0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9c0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
1b9d0 70 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  pKey or if the t
1b9e0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba00 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
1ba10 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
1ba20 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
1ba30 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
1ba40 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
1ba50 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
1ba60 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1ba70 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
1ba90 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 4b 65  ctly matches pKe
1baa0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
1bab0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
1bac0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1bad0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1bae0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1baf0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
1bb00 72 67 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a  rger than pKey..
1bb10 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
1bb20 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20  3BtreeMoveto(.  
1bb30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1bb40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
1bb50 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
1bb60 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1bb70 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
1bb80 54 68 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20  The key content 
1bb90 66 6f 72 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f  for indices.  No
1bba0 74 20 75 73 65 64 20 62 79 20 74 61 62 6c 65 73  t used by tables
1bbb0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1bbc0 63 6f 72 64 20 2a 70 55 6e 4b 65 79 2c 2f 2a 20  cord *pUnKey,/* 
1bbd0 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
1bbe0 20 6f 66 20 70 4b 65 79 20 2a 2f 0a 20 20 69 36   of pKey */.  i6
1bbf0 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
1bc00 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1bc10 70 4b 65 79 2e 20 20 4f 72 20 74 68 65 20 6b 65  pKey.  Or the ke
1bc20 79 20 66 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a  y for tables */.
1bc30 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
1bc40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1bc50 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
1bc60 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
1bc70 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
1bc80 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
1bc90 20 2f 2a 20 53 65 61 72 63 68 20 72 65 73 75 6c   /* Search resul
1bca0 74 20 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69  t flag */.){.  i
1bcb0 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 61 53  nt rc;.  char aS
1bcc0 70 61 63 65 5b 32 30 30 5d 3b 0a 0a 20 20 61 73  pace[200];..  as
1bcd0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1bce0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1bcf0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1bd00 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1bd10 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1bd20 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
1bd30 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1bd40 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
1bd50 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
1bd60 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
1bd70 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
1bd80 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1bd90 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1bda0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
1bdb0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1bdc0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
1bdd0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 26 26  ur->validNKey &&
1bde0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e   pCur->pPage->in
1bdf0 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20  tKey ){.    if( 
1be00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
1be10 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  =nKey ){.      *
1be20 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1be30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1be40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1be50 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20  pCur->atLast && 
1be60 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
1be70 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  nKey ){.      *p
1be80 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
1be90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1beb0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
1bec0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
1bed0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1bee0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1bef0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
1bf00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1bf10 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1bf20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1bf30 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1bf40 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
1bf50 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
1bf60 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
1bf70 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
1bf80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bf90 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
1bfa0 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  >pPage->intKey )
1bfb0 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20  {.    /* We are 
1bfc0 67 69 76 65 6e 20 61 6e 20 53 51 4c 20 74 61 62  given an SQL tab
1bfd0 6c 65 20 74 6f 20 73 65 61 72 63 68 2e 20 20 54  le to search.  T
1bfe0 68 65 20 6b 65 79 20 69 73 20 74 68 65 20 69 6e  he key is the in
1bff0 74 65 67 65 72 0a 20 20 20 20 2a 2a 20 72 6f 77  teger.    ** row
1c000 69 64 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  id contained in 
1c010 6e 4b 65 79 2e 20 20 70 4b 65 79 20 61 6e 64 20  nKey.  pKey and 
1c020 70 55 6e 4b 65 79 20 73 68 6f 75 6c 64 20 62 6f  pUnKey should bo
1c030 74 68 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  th be NULL */.  
1c040 20 20 61 73 73 65 72 74 28 20 70 55 6e 4b 65 79    assert( pUnKey
1c050 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1c060 74 28 20 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  t( pKey==0 );.  
1c070 7d 65 6c 73 65 20 69 66 28 20 70 55 6e 4b 65 79  }else if( pUnKey
1c080 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  ==0 ){.    /* We
1c090 20 61 72 65 20 74 6f 20 73 65 61 72 63 68 20 61   are to search a
1c0a0 6e 20 53 51 4c 20 69 6e 64 65 78 20 75 73 69 6e  n SQL index usin
1c0b0 67 20 61 20 6b 65 79 20 65 6e 63 6f 64 65 64 20  g a key encoded 
1c0c0 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a  as a blob..    *
1c0d0 2a 20 54 68 65 20 62 6c 6f 62 20 69 73 20 66 6f  * The blob is fo
1c0e0 75 6e 64 20 61 74 20 70 4b 65 79 20 61 6e 64 20  und at pKey and 
1c0f0 69 73 20 6e 4b 65 79 20 62 79 74 65 73 20 69 6e  is nKey bytes in
1c100 20 6c 65 6e 67 74 68 2e 20 20 55 6e 70 61 63 6b   length.  Unpack
1c110 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6b 65 79  .    ** this key
1c120 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
1c130 75 73 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 61  use it. */.    a
1c140 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20 29  ssert( pKey!=0 )
1c150 3b 0a 20 20 20 20 70 55 6e 4b 65 79 20 3d 20 73  ;.    pUnKey = s
1c160 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1c170 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
1c180 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65  yInfo, nKey, pKe
1c190 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69        aSpace, si
1c1c0 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20  zeof(aSpace));. 
1c1d0 20 20 20 69 66 28 20 70 55 6e 4b 65 79 3d 3d 30     if( pUnKey==0
1c1e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1c1f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
1c200 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
1c210 6f 20 73 65 61 72 63 68 20 61 6e 20 53 51 4c 20  o search an SQL 
1c220 69 6e 64 65 78 20 75 73 69 6e 67 20 61 20 6b 65  index using a ke
1c230 79 20 74 68 61 74 20 69 73 20 61 6c 72 65 61 64  y that is alread
1c240 79 20 75 6e 70 61 63 6b 65 64 0a 20 20 20 20 2a  y unpacked.    *
1c250 2a 20 61 6e 64 20 68 61 6e 64 65 64 20 74 6f 20  * and handed to 
1c260 75 73 20 69 6e 20 70 55 6e 4b 65 79 2e 20 2a 2f  us in pUnKey. */
1c270 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65  .    assert( pKe
1c280 79 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 66 6f  y==0 );.  }.  fo
1c290 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
1c2a0 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e  wr, upr;.    Pgn
1c2b0 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
1c2c0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
1c2d0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
1c2e0 69 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20  int c = -1;  /* 
1c2f0 70 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74  pRes return if t
1c300 61 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75  able is empty mu
1c310 73 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20  st be -1 */.    
1c320 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
1c330 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
1c340 31 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  1;.    if( !pPag
1c350 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 55 6e  e->intKey && pUn
1c360 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
1c370 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1c380 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1c390 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1c3a0 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sh;.    }.    if
1c3b0 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20  ( biasRight ){. 
1c3c0 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
1c3d0 20 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   upr;.    }else{
1c3e0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78  .      pCur->idx
1c3f0 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a   = (upr+lwr)/2;.
1c400 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77      }.    if( lw
1c410 72 3c 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29  r<=upr ) for(;;)
1c420 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43  {.      void *pC
1c430 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36  ellKey;.      i6
1c440 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
1c450 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1c460 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  ze = 0;.      pC
1c470 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1c480 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  1;.      if( pPa
1c490 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1c4a0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
1c4b0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
1c4c0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1c4d0 20 70 43 75 72 2d 3e 69 64 78 29 20 2b 20 70 50   pCur->idx) + pP
1c4e0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
1c4f0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
1c500 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
1c510 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64  .          u32 d
1c520 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
1c530 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69  pCell += getVari
1c540 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d  nt32(pCell, dumm
1c550 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
1c560 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
1c570 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
1c580 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
1c590 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 6e   if( nCellKey==n
1c5a0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1c5b0 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   c = 0;.        
1c5c0 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
1c5d0 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  ey<nKey ){.     
1c5e0 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
1c5f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
1c610 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20 29 3b 0a 20  ellKey>nKey );. 
1c620 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b           c = +1;
1c630 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c650 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20  int available;. 
1c660 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1c670 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50  = (void *)fetchP
1c680 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76  ayload(pCur, &av
1c690 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  ailable, 0);.   
1c6a0 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20       nCellKey = 
1c6b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1c6c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76 61  .        if( ava
1c6d0 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79  ilable>=nCellKey
1c6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1c6f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1c700 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
1c710 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  Key, pCellKey, p
1c720 55 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  UnKey);.        
1c730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c740 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
1c750 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
1c760 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
1c770 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
1c780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c790 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1c7a0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
1c7b0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1c7c0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
1c7d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1c7e0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43  lite3BtreeKey(pC
1c7f0 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  ur, 0, nCellKey,
1c800 20 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65   (void *)pCellKe
1c810 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  y);.          c 
1c820 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1c830 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
1c840 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  Key, pCellKey, p
1c850 55 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  UnKey);.        
1c860 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c870 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1c880 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1c890 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1c8a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c8b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
1c8c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
1c8d0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
1c8e0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
1c8f0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1c900 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
1c910 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
1c920 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b  lwr = pCur->idx;
1c930 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
1c940 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20   lwr - 1;.      
1c950 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c970 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
1c980 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1c990 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c9a0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1c9b0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c9c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c9d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
1c9e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
1c9f0 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a   = pCur->idx+1;.
1ca00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ca10 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d       upr = pCur-
1ca20 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  >idx-1;.      }.
1ca30 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
1ca40 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  r ){.        pCu
1ca50 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
1ca60 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
1ca70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1ca80 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
1ca90 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20  = (lwr+upr)/2;. 
1caa0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1cab0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20   lwr==upr+1 );. 
1cac0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1cad0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
1cae0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1caf0 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
1cb00 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1cb10 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
1cb20 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
1cb30 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
1cb40 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1cb50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1cb60 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
1cb70 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
1cb80 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1cb90 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
1cba0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
1cbb0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
1cbc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1cbd0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
1cbe0 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
1cbf0 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ell );.      if(
1cc00 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
1cc10 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
1cc20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
1cc30 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1cc40 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
1cc50 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20  r->idx = lwr;.  
1cc60 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1cc70 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
1cc80 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1cc90 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1cca0 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
1ccb0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
1ccc0 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
1ccd0 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  nish;.  }.moveto
1cce0 5f 66 69 6e 69 73 68 3a 0a 20 20 69 66 28 20 70  _finish:.  if( p
1ccf0 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  Key ){.    /* If
1cd00 20 77 65 20 63 72 65 61 74 65 64 20 6f 75 72 20   we created our 
1cd10 6f 77 6e 20 75 6e 70 61 63 6b 65 64 20 6b 65 79  own unpacked key
1cd20 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
1cd30 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
1cd40 64 75 72 65 2c 20 74 68 65 6e 20 64 65 73 74 72  dure, then destr
1cd50 6f 79 20 74 68 61 74 20 6b 65 79 20 62 65 66 6f  oy that key befo
1cd60 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1cd70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cd80 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
1cd90 63 6f 72 64 28 70 55 6e 4b 65 79 29 3b 0a 20 20  cord(pUnKey);.  
1cda0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1cdb0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
1cdc0 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
1cdd0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1cde0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
1cdf0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
1ce00 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
1ce10 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
1ce20 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ce30 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
1ce40 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
1ce50 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1ce60 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
1ce70 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
1ce80 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
1ce90 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
1cea0 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
1ceb0 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
1cec0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1ced0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
1cee0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1cef0 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
1cf00 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1cf10 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
1cf20 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
1cf30 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
1cf40 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
1cf50 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
1cf60 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
1cf70 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
1cf80 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
1cf90 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
1cfa0 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
1cfb0 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
1cfc0 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
1cfd0 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
1cfe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1cff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1d000 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
1d010 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  for a cursor..*/
1d020 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
1d030 33 42 74 72 65 65 43 75 72 73 6f 72 44 62 28 63  3BtreeCursorDb(c
1d040 6f 6e 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70  onst BtCursor *p
1d050 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
1d060 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1d070 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1d080 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1d090 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42   return pCur->pB
1d0a0 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a  tree->db;.}../*.
1d0b0 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
1d0c0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
1d0d0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1d0e0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
1d0f0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
1d100 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
1d110 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
1d120 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
1d130 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
1d140 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1d150 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
1d160 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1d170 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
1d180 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
1d190 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1d1a0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
1d1b0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1d1c0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
1d1d0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1d1e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1d1f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1d200 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1d210 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1d220 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
1d230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1d240 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1d250 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
1d260 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
1d270 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
1d280 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
1d290 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
1d2a0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
1d2b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d2c0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1d2d0 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20  Cur->skip>0 ){. 
1d2e0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
1d2f0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
1d300 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1d310 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
1d320 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
1d330 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1d340 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
1d350 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50  rt( pCur->idx<pP
1d360 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
1d370 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20   pCur->idx++;.  
1d380 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1d390 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1d3a0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
1d3b0 66 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50  f( pCur->idx>=pP
1d3c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
1d3d0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1d3e0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
1d3f0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1d400 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
1d410 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1d420 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
1d430 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1d440 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d450 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1d460 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1d470 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1d480 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d490 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
1d4a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
1d4b0 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61  eeIsRootPage(pPa
1d4c0 67 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ge) ){.        *
1d4d0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1d4e0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1d4f0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1d500 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d510 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1d520 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1d530 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e  BtreeMoveToParen
1d540 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
1d550 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1d560 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ge;.    }while( 
1d570 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65  pCur->idx>=pPage
1d580 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a  ->nCell );.    *
1d590 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  pRes = 0;.    if
1d5a0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
1d5b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1d5c0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
1d5d0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
1d5e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1d5f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d600 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
1d610 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
1d620 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  0;.  if( pPage->
1d630 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
1d640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d650 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c  }.  rc = moveToL
1d660 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1d670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1d680 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
1d690 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
1d6a0 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
1d6b0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
1d6c0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
1d6d0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
1d6e0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
1d6f0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
1d700 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
1d710 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
1d720 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1d730 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
1d740 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1d750 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
1d760 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
1d770 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
1d780 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
1d790 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1d7a0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1d7b0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65 6d  Pgno pgno;.  Mem
1d7c0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1d7d0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1d7e0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1d7f0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1d800 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1d810 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
1d820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d830 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1d840 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
1d850 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   0;.  if( CURSOR
1d860 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1d870 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
1d880 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
1d890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d8a0 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
1d8b0 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  kip<0 ){.    pCu
1d8c0 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
1d8d0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1d8e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d8f0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
1d900 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
1d910 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1d920 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1d930 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1d940 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1d950 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  0 );.  if( !pPag
1d960 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
1d970 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20  gno = get4byte( 
1d980 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1d990 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20  pCur->idx) );.  
1d9a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1d9b0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1d9c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d9d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d9e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1d9f0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
1da00 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
1da10 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
1da20 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  dx==0 ){.      i
1da30 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
1da40 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29  sRootPage(pPage)
1da50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
1da60 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1da70 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1da80 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1da90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1daa0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1dab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1dac0 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70  eeMoveToParent(p
1dad0 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
1dae0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1daf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1db00 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72  >idx--;.    pCur
1db10 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1db20 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
1db30 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  dNKey = 0;.    i
1db40 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1db50 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
1db60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1db70 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
1db80 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
1db90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1dba0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1dbb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1dbc0 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
1dbd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1dbe0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
1dbf0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
1dc00 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1dc10 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
1dc20 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
1dc30 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
1dc40 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
1dc50 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
1dc60 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
1dc70 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
1dc80 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
1dc90 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
1dca0 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
1dcb0 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
1dcc0 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
1dcd0 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
1dce0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
1dcf0 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
1dd00 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
1dd10 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
1dd20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1dd30 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1dd40 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
1dd50 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
1dd60 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
1dd70 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
1dd80 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
1dd90 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
1dda0 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
1ddb0 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
1ddc0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1ddd0 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
1dde0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
1ddf0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
1de00 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
1de10 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
1de20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
1de30 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
1de40 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
1de50 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
1de60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
1de70 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
1de80 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
1de90 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
1dea0 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
1deb0 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
1dec0 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
1ded0 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
1dee0 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
1def0 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
1df00 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
1df10 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
1df20 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1df30 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
1df40 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
1df50 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
1df60 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
1df70 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
1df80 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
1df90 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
1dfa0 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
1dfb0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1dfc0 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
1dfd0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
1dfe0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1dff0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1e000 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
1e010 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
1e020 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
1e030 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
1e040 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
1e050 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
1e060 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
1e070 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
1e080 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
1e090 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
1e0a0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  freelist */.  in
1e0b0 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t k;     /* Numb
1e0c0 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
1e0d0 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
1e0e0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
1e0f0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
1e100 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1e110 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a  PrevTrunk = 0;..
1e120 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e130 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1e140 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
1e150 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
1e160 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  e1;.  n = get4by
1e170 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e180 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e  a[36]);.  if( n>
1e190 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
1e1a0 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
1e1b0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
1e1c0 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
1e1d0 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
1e1e0 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
1e1f0 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
1e200 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
1e210 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
1e220 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
1e230 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
1e240 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63   /* If the 'exac
1e250 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73  t' parameter was
1e260 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72   true and a quer
1e270 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
1e280 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
1e290 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
1e2a0 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
1e2b0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
1e2c0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
1e2d0 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
1e2e0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
1e2f0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
1e300 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
1e310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1e320 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1e330 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62  ( exact && nearb
1e340 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  y<=pagerPagecoun
1e350 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
1e360 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  {.      u8 eType
1e370 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e380 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
1e390 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1e3a0 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
1e3b0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1e3c0 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
1e3d0 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
1e3e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e3f0 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65   rc;.      if( e
1e400 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
1e410 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
1e420 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
1e430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1e440 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a  pPgno = nearby;.
1e450 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1e460 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
1e470 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
1e480 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
1e490 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
1e4a0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
1e4b0 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
1e4c0 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
1e4d0 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
1e4e0 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
1e4f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e500 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1e510 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1e520 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1e530 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
1e540 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e550 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
1e560 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
1e570 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
1e580 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
1e590 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
1e5a0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
1e5b0 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
1e5c0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
1e5d0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
1e5e0 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
1e5f0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
1e600 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
1e610 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
1e620 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
1e630 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
1e640 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
1e650 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
1e660 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1e670 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
1e680 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
1e690 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
1e6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1e6b0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
1e6c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1e6d0 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
1e6e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e6f0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1e700 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
1e710 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  k, 0);.      if(
1e720 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
1e730 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
1e740 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1e750 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1e760 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
1e770 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
1e780 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
1e790 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
1e7a0 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
1e7b0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1e7c0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
1e7d0 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
1e7e0 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
1e7f0 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
1e800 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
1e810 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
1e820 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
1e830 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
1e840 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
1e850 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
1e860 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
1e870 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
1e880 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e890 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1e8a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e8b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1e8c0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1e8d0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1e8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
1e8f0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
1e900 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1e910 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1e920 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1e930 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1e940 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
1e950 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
1e960 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
1e970 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1e980 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
1e990 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
1e9a0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
1e9b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1e9c0 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ( k>pBt->usableS
1e9d0 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
1e9e0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
1e9f0 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
1ea00 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
1ea10 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1ea20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ea30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ea40 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1ea50 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
1ea60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ea70 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1ea80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
1ea90 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62  rchList && nearb
1eaa0 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20  y==iTrunk ){.   
1eab0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
1eac0 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
1ead0 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
1eae0 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
1eaf0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
1eb00 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
1eb10 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
1eb20 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
1eb30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1eb40 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
1eb50 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20  o==iTrunk );.   
1eb60 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
1eb70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
1eb80 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
1eb90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1eba0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
1ebb0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1ebc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1ebd0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
1ebe0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1ebf0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
1ec00 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
1ec10 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1ec20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
1ec30 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1ec40 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
1ec50 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
1ec60 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1ec70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ec80 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1ec90 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1eca0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
1ecb0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1ecc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ecd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ece0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
1ecf0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
1ed00 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1ed10 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
1ed20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
1ed30 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
1ed40 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
1ed50 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
1ed60 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
1ed70 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
1ed80 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
1ed90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1eda0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
1edb0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
1edc0 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
1edd0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
1ede0 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
1edf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1ee00 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1ee10 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
1ee20 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
1ee30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1ee40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
1ee60 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1ee70 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
1ee80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1ee90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1eea0 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
1eeb0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1eec0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1eed0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1eee0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
1eef0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1ef00 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1ef10 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1ef20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ef30 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
1ef40 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
1ef50 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1ef60 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1ef70 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
1ef80 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
1ef90 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
1efa0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
1efb0 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
1efc0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
1efd0 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
1efe0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1eff0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
1f000 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
1f010 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1f020 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f030 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1f040 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
1f050 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1f060 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1f070 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f080 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
1f090 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1f0a0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
1f0c0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1f0d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
1f0e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
1f0f0 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
1f100 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
1f110 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1f120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f130 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1f140 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
1f150 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1f160 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
1f170 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
1f180 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
1f190 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
1f1a0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
1f1b0 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
1f1c0 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
1f1d0 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73          int clos
1f1e0 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
1f1f0 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
1f200 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1f210 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
1f220 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72  aData;.        r
1f230 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f240 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
1f250 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1f260 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1f270 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1f280 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
1f290 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1f2a0 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
1f2b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64          int i, d
1f2c0 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ist;.          c
1f2d0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
1f2e0 20 20 20 20 20 20 64 69 73 74 20 3d 20 67 65 74        dist = get
1f2f0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
1f300 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
1f310 20 20 20 20 20 69 66 28 20 64 69 73 74 3c 30 20       if( dist<0 
1f320 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a  ) dist = -dist;.
1f330 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
1f340 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
1f350 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
1f360 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1f370 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
1f380 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rby;.           
1f390 20 69 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d   if( d2<0 ) d2 =
1f3a0 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20   -d2;.          
1f3b0 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
1f3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1f3d0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
1f3e0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
1f3f0 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
1f400 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1f410 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f420 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1f430 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
1f440 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
1f450 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1f460 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
1f470 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
1f480 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d  chList || iPage=
1f490 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
1f4a0 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a       int nPage;.
1f4b0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
1f4c0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
1f4d0 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61 67 65      nPage = page
1f4e0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1f4f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1f500 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50     if( *pPgno>nP
1f510 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
1f520 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20     /* Free page 
1f530 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
1f540 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20  he file */.     
1f550 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1f560 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1f570 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1f580 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1f590 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
1f5a0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
1f5b0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1f5c0 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
1f5d0 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5f0 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
1f600 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
1f610 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
1f620 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
1f630 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
1f640 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
1f650 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
1f660 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
1f670 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
1f680 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
1f690 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
1f6a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f6b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
1f6c0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
1f6d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f6e0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1f6f0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
1f700 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  Page, 1);.      
1f710 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f730 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f740 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a  rDontRollback((*
1f750 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
1f760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1f770 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f780 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
1f790 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1f7a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f7b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f7c0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1f7d0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f7f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f800 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1f810 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
1f820 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
1f830 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
1f840 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
1f850 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
1f860 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
1f870 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
1f880 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
1f890 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
1f8a0 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
1f8b0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
1f8c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
1f8d0 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1f8e0 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70     int nPage = p
1f8f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1f900 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1f910 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b  *pPgno = nPage +
1f920 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   1;..#ifndef SQL
1f930 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f940 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1f950 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20  >nTrunc ){.     
1f960 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63 75   /* An incr-vacu
1f970 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  um has already r
1f980 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  un within this t
1f990 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74  ransaction. So t
1f9a0 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  he.      ** page
1f9b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73 20   to allocate is 
1f9c0 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70 68 79  not from the phy
1f9d0 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74 68 65  sical end of the
1f9e0 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20 20 20   file, but.     
1f9f0 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72 75   ** at pBt->nTru
1fa00 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nc. .      */.  
1fa10 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
1fa20 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20  ->nTrunc+1;.    
1fa30 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
1fa40 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1fa50 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
1fa60 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
1fa70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1fa80 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1fa90 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
1faa0 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20  GE(pBt, *pPgno) 
1fab0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
1fac0 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
1fad0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1fae0 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
1faf0 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
1fb00 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
1fb10 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
1fb20 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
1fb30 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
1fb40 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
1fb50 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
1fb60 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
1fb70 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
1fb80 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
1fb90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52       */.      TR
1fba0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1fbb0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
1fbc0 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
1fbd0 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e   page)\n", *pPgn
1fbe0 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  o));.      asser
1fbf0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
1fc00 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1fc10 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67  ) );.      (*pPg
1fc20 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  no)++;.      if(
1fc30 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
1fc40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1fc50 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d  ){ (*pPgno)++; }
1fc60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1fc70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20  Bt->nTrunc ){.  
1fc80 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
1fc90 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a  = *pPgno;.    }.
1fca0 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65  #endif..    asse
1fcb0 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
1fcc0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fcd0 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  t) );.    rc = s
1fce0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1fcf0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
1fd00 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
1fd10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1fd20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
1fd30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
1fd40 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
1fd50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1fd60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fd70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
1fd80 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
1fd90 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
1fda0 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
1fdb0 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
1fdc0 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
1fdd0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
1fde0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1fdf0 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
1fe00 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
1fe10 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
1fe20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
1fe30 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
1fe40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fe50 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f  .** Add a page o
1fe60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1fe70 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ile to the freel
1fe80 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ist..**.** sqlit
1fe90 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
1fea0 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72  s NOT called for
1feb0 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
1fec0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
1fed0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1fee0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1fef0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1ff00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1ff10 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1ff20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a   int rc, n, k;..
1ff30 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65    /* Prepare the
1ff40 20 70 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e   page for freein
1ff50 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  g */.  assert( s
1ff60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1ff70 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1ff80 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1ff90 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20  ( pPage->pgno>1 
1ffa0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  );.  pPage->isIn
1ffb0 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  it = 0;.  releas
1ffc0 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61  ePage(pPage->pPa
1ffd0 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e  rent);.  pPage->
1ffe0 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  pParent = 0;..  
1fff0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
20000 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
20010 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
20020 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20030 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
20040 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
20050 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20060 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
20070 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
20080 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
20090 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
200a0 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20  , n+1);..#ifdef 
200b0 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
200c0 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65  LETE.  /* If the
200d0 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
200e0 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69  ELETE compile-ti
200f0 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  me option is ena
20100 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  bled, then.  ** 
20110 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
20120 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
20130 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
20140 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  zeros..  */.  rc
20150 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20160 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
20170 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
20180 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
20190 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
201a0 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
201b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e  ->pageSize);.#en
201c0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
201d0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
201e0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
201f0 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
20200 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
20210 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
20220 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
20230 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
20240 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
20250 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  M ){.    rc = pt
20260 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
20270 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
20280 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
20290 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
202a0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
202b0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ( n==0 ){.    /*
202c0 20 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72   This is the fir
202d0 73 74 20 66 72 65 65 20 70 61 67 65 20 2a 2f 0a  st free page */.
202e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
202f0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
20300 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20310 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20320 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  rc;.    memset(p
20330 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
20340 38 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  8);.    put4byte
20350 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
20360 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  32], pPage->pgno
20370 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 46  );.    TRACE(("F
20380 52 45 45 2d 50 41 47 45 3a 20 25 64 20 66 69 72  REE-PAGE: %d fir
20390 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  st\n", pPage->pg
203a0 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no));.  }else{. 
203b0 20 20 20 2f 2a 20 4f 74 68 65 72 20 66 72 65 65     /* Other free
203c0 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 65   pages already e
203d0 78 69 73 74 2e 20 20 52 65 74 72 69 76 65 20 74  xist.  Retrive t
203e0 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  he first trunk p
203f0 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  age.    ** of th
20400 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 66  e freelist and f
20410 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ind out how many
20420 20 6c 65 61 76 65 73 20 69 74 20 68 61 73 2e 20   leaves it has. 
20430 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
20440 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72 63 20 3d  pTrunk;.    rc =
20450 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
20460 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
20470 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20480 61 5b 33 32 5d 29 2c 20 26 70 54 72 75 6e 6b 2c  a[32]), &pTrunk,
20490 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
204a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
204b0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
204c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
204d0 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 42 74  ;.    if( k>=pBt
204e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
204f0 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54   8 ){.      /* T
20500 68 65 20 74 72 75 6e 6b 20 69 73 20 66 75 6c 6c  he trunk is full
20510 2e 20 20 54 75 72 6e 20 74 68 65 20 70 61 67 65  .  Turn the page
20520 20 62 65 69 6e 67 20 66 72 65 65 64 20 69 6e 74   being freed int
20530 6f 20 61 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a  o a new.      **
20540 20 74 72 75 6e 6b 20 70 61 67 65 20 77 69 74 68   trunk page with
20550 20 6e 6f 20 6c 65 61 76 65 73 2e 0a 20 20 20 20   no leaves..    
20560 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
20570 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
20580 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
20590 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
205a0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
205b0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
205c0 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
205d0 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
205e0 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
205f0 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
20600 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
20610 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
20620 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
20630 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
20640 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
20650 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
20660 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
20670 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
20680 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
20690 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
206a0 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
206b0 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
206c0 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
206d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
206e0 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
206f0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
20700 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
20710 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
20720 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
20730 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74  tain to restrict
20740 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
20750 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
20760 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
20770 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
20780 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
20790 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
207a0 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
207b0 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
207c0 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
207d0 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
207e0 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
207f0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
20800 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
20810 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
20820 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
20830 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
20840 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20850 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20860 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
20870 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
20880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20890 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
208a0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
208b0 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b  , pTrunk->pgno);
208c0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
208d0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
208e0 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  4], 0);.        
208f0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
20900 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61  ->aData[32], pPa
20910 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
20920 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
20930 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
20940 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
20950 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  g %d\n",.       
20960 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
20970 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  pgno, pTrunk->pg
20980 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
20990 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c 30 20    }else if( k<0 
209a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
209b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
209c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
209d0 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20  * Add the newly 
209e0 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20  freed page as a 
209f0 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72  leaf on the curr
20a00 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  ent trunk */.   
20a10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20a20 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
20a30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20a40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20a50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
20a60 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
20a70 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b  >aData[4], k+1);
20a80 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
20a90 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
20aa0 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e  [8+k*4], pPage->
20ab0 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
20ac0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
20ad0 45 54 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ETE.        sqli
20ae0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
20af0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
20b00 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
20b10 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
20b20 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
20b30 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
20b40 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
20b50 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
20b60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
20b70 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
20b80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20b90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
20ba0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
20bb0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
20bc0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
20bd0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
20be0 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
20bf0 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
20c00 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
20c10 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
20c20 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
20c30 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
20c40 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
20c50 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
20c60 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20  nt nOvfl;.  int 
20c70 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
20c80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20c90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
20ca0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
20cb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
20cc0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
20cd0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
20ce0 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
20cf0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
20d00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20d10 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
20d20 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
20d30 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
20d40 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
20d50 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
20d60 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
20d70 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
20d80 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
20d90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
20da0 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
20db0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
20dc0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
20dd0 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
20de0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
20df0 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
20e00 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
20e10 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
20e20 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  -- ){.    MemPag
20e30 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66  e *pOvfl;.    if
20e40 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
20e50 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50   ovflPgno>pagerP
20e60 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
20e70 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
20e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20e90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
20ea0 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76  ..    rc = getOv
20eb0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
20ec0 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
20ed0 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26  , (nOvfl==0)?0:&
20ee0 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69  ovflPgno);.    i
20ef0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
20f00 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  c;.    rc = free
20f10 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
20f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
20f30 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
20f40 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
20f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
20f60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20f70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
20f80 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
20f90 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
20fa0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
20fb0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
20fc0 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
20fd0 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
20fe0 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
20ff0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
21000 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
21010 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
21020 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
21030 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
21040 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
21050 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
21060 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
21070 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
21080 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
21090 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
210a0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
210b0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
210c0 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
210d0 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
210e0 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
210f0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
21100 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
21110 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
21120 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
21130 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
21140 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
21150 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
21160 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
21170 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
21180 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
21190 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
211a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
211b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
211c0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
211d0 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
211e0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
211f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
21200 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
21210 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
21220 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
21230 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
21240 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
21250 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
21260 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
21270 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
21280 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
21290 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
212a0 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
212b0 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
212c0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
212f0 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
21300 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
21310 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
21320 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
21330 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
21340 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
21350 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
21360 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
21370 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
21380 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
21390 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
213a0 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
213b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
213c0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
213d0 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
213e0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
213f0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
21400 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21410 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
21420 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
21430 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
21440 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
21450 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
21460 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
21470 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
21480 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
21490 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
214a0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
214b0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
214c0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
214d0 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
214e0 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
214f0 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
21500 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
21510 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
21520 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
21530 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  nKey);.  sqlite3
21540 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
21550 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
21560 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
21570 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
21580 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
21590 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
215a0 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
215b0 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44  ( info.nData==nD
215c0 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a  ata+nZero );.  .
215d0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
215e0 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
215f0 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
21600 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
21610 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
21620 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
21630 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
21640 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
21650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
21660 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
21670 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
21680 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65  ;.    nSrc = nKe
21690 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
216a0 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
216b0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
216c0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
216d0 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
216e0 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
216f0 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
21700 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
21710 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
21720 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
21730 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Left==0 ){.     
21740 20 69 6e 74 20 69 73 45 78 61 63 74 20 3d 20 30   int isExact = 0
21750 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21760 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21770 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
21780 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
21790 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
217a0 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
217b0 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
217c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
217d0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
217e0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
217f0 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
21800 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
21810 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
21820 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
21830 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
21840 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
21850 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
21860 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
21870 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a  ( pgnoOvfl>1 ){.
21880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 45            /* isE
21890 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20  xact = 1; */.   
218a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
218b0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
218c0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
218d0 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
218e0 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
218f0 76 66 6c 2c 20 69 73 45 78 61 63 74 29 3b 0a 23  vfl, isExact);.#
21900 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21910 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
21920 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
21930 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
21940 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
21950 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
21960 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
21970 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
21980 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
21990 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
219a0 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
219b0 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
219c0 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
219d0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
219e0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
219f0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
21a00 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
21a10 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
21a20 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
21a30 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
21a40 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
21a50 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
21a60 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
21a70 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
21a80 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
21a90 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
21aa0 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
21ab0 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
21ac0 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
21ad0 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
21ae0 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
21af0 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
21b00 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
21b10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
21b20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
21b30 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
21b40 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
21b50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
21b60 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
21b70 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
21b80 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
21b90 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
21ba0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
21bb0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
21bc0 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
21bd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
21be0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
21bf0 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
21c00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
21c10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21c20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21c30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21c40 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
21c50 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21c60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
21c70 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
21c80 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
21c90 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
21ca0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
21cb0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
21cc0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
21cd0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
21ce0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
21cf0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
21d00 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
21d10 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
21d20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
21d30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
21d40 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
21d50 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
21d60 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
21d70 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
21d80 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ;.    if( nSrc>0
21d90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
21da0 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
21db0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21dc0 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
21dd0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
21de0 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
21df0 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
21e00 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
21e10 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
21e20 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
21e30 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
21e40 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
21e50 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
21e60 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
21e70 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
21e80 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
21e90 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
21ea0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
21eb0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
21ec0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
21ed0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21ee0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  K;.}.../*.** Cha
21ef0 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  nge the MemPage.
21f00 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
21f10 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73  on the page whos
21f20 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67  e number is.** g
21f30 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f  iven in the seco
21f40 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74  nd argument so t
21f50 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72  hat MemPage.pPar
21f60 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a  ent holds the.**
21f70 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
21f80 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a  third argument..
21f90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e  **.** If the fin
21fa0 61 6c 20 61 72 67 75 6d 65 6e 74 2c 20 75 70 64  al argument, upd
21fb0 61 74 65 50 74 72 6d 61 70 2c 20 69 73 20 6e 6f  atePtrmap, is no
21fc0 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 64  n-zero and the d
21fd0 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 61 6e  atabase.** is an
21fe0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
21ff0 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
22000 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
22010 79 20 66 6f 72 20 70 67 6e 6f 0a 2a 2a 20 69 73  y for pgno.** is
22020 20 75 70 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61   updated..*/.sta
22030 74 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74  tic int reparent
22040 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
22050 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
22060 20 20 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20        /* B-Tree 
22070 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 50  structure */.  P
22080 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
220a0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 63  Page number of c
220b0 68 69 6c 64 20 62 65 69 6e 67 20 61 64 6f 70 74  hild being adopt
220c0 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ed */.  MemPage 
220d0 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20 20 20 20  *pNewParent,    
220e0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61 72        /* New par
220f0 65 6e 74 20 6f 66 20 70 67 6e 6f 20 2a 2f 0a 20  ent of pgno */. 
22100 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22120 2a 20 49 6e 64 65 78 20 6f 66 20 63 68 69 6c 64  * Index of child
22130 20 70 61 67 65 20 70 67 6e 6f 20 69 6e 20 70 4e   page pgno in pN
22140 65 77 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e  ewParent */.  in
22150 74 20 75 70 64 61 74 65 50 74 72 6d 61 70 20 20  t updatePtrmap  
22160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22170 66 20 74 72 75 65 2c 20 75 70 64 61 74 65 20 70  f true, update p
22180 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20 70  ointer-map for p
22190 67 6e 6f 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  gno */.){.  MemP
221a0 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62  age *pThis;.  Db
221b0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
221c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
221d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
221e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
221f0 73 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74  sert( pNewParent
22200 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  !=0 );.  if( pgn
22210 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  o==0 ) return SQ
22220 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
22230 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  t( pBt->pPager!=
22240 30 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  0 );.  pDbPage =
22250 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
22260 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
22270 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
22280 62 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68  bPage ){.    pTh
22290 69 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  is = (MemPage *)
222a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
222b0 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
222c0 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73     if( pThis->is
222d0 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Init ){.      as
222e0 73 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61  sert( pThis->aDa
222f0 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ta==sqlite3Pager
22300 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
22310 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
22320 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e  his->pParent!=pN
22330 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  ewParent ){.    
22340 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70      if( pThis->p
22350 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74 65 33  Parent ) sqlite3
22360 50 61 67 65 72 55 6e 72 65 66 28 70 54 68 69 73  PagerUnref(pThis
22370 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  ->pParent->pDbPa
22380 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 54 68  ge);.        pTh
22390 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e  is->pParent = pN
223a0 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20  ewParent;.      
223b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
223c0 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 44  f(pNewParent->pD
223d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  bPage);.      }.
223e0 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69 64 78        pThis->idx
223f0 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20 20  Parent = idx;.  
22400 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
22410 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
22420 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 49  e);.  }..  if( I
22430 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20 75  SAUTOVACUUM && u
22440 70 64 61 74 65 50 74 72 6d 61 70 20 29 7b 0a 20  pdatePtrmap ){. 
22450 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70     return ptrmap
22460 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50  Put(pBt, pgno, P
22470 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
22480 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  wParent->pgno);.
22490 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
224a0 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
224b0 75 70 64 61 74 65 50 74 72 6d 61 70 20 66 6c 61  updatePtrmap fla
224c0 67 20 77 61 73 20 63 6c 65 61 72 2c 20 61 73 73  g was clear, ass
224d0 65 72 74 20 74 68 61 74 20 74 68 65 20 65 6e 74  ert that the ent
224e0 72 79 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  ry in the.  ** p
224f0 6f 69 6e 74 65 72 2d 6d 61 70 20 69 73 20 61 6c  ointer-map is al
22500 72 65 61 64 79 20 63 6f 72 72 65 63 74 2e 0a 20  ready correct.. 
22510 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
22520 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 44  VACUUM ){.    pD
22530 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
22540 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
22550 70 50 61 67 65 72 2c 50 54 52 4d 41 50 5f 50 41  pPager,PTRMAP_PA
22560 47 45 4e 4f 28 70 42 74 2c 70 67 6e 6f 29 29 3b  GENO(pBt,pgno));
22570 0a 20 20 20 20 69 66 28 20 70 44 62 50 61 67 65  .    if( pDbPage
22580 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79   ){.      u8 eTy
22590 70 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  pe;.      Pgno i
225a0 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  i;.      int rc 
225b0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
225c0 20 70 67 6e 6f 2c 20 26 65 54 79 70 65 2c 20 26   pgno, &eType, &
225d0 69 69 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ii);.      asser
225e0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
225f0 20 26 26 20 69 69 3d 3d 70 4e 65 77 50 61 72 65   && ii==pNewPare
22600 6e 74 2d 3e 70 67 6e 6f 20 26 26 20 65 54 79 70  nt->pgno && eTyp
22610 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
22620 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22630 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
22640 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ge);.    }.  }.#
22650 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
22660 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
22670 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
22680 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72   pParent pointer
22690 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   of all children
226a0 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69   of pPage to poi
226b0 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50  nt back.** to pP
226c0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  age..**.** In ot
226d0 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65  her words, for e
226e0 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50  very child of pP
226f0 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61  age, invoke repa
22700 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f  rentPage().** to
22710 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
22720 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73  each child knows
22730 20 74 68 61 74 20 70 50 61 67 65 20 69 73 20 69   that pPage is i
22740 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a  ts parent..**.**
22750 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
22760 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  ts called after 
22770 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65  you memcpy() one
22780 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e   page into.** an
22790 6f 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  other..**.** If 
227a0 75 70 64 61 74 65 50 74 72 6d 61 70 20 69 73 20  updatePtrmap is 
227b0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 70  true, then the p
227c0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
227d0 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
227e0 0a 2a 2a 20 70 61 67 65 73 20 6f 66 20 70 50 61  .** pages of pPa
227f0 67 65 20 61 72 65 20 75 70 64 61 74 65 64 2e 0a  ge are updated..
22800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
22810 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
22820 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
22830 20 69 6e 74 20 75 70 64 61 74 65 50 74 72 6d 61   int updatePtrma
22840 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
22850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
22860 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22870 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
22880 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
22890 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
228a0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
228b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
228c0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
228d0 20 20 50 67 6e 6f 20 69 52 69 67 68 74 20 3d 20    Pgno iRight = 
228e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
228f0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
22900 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 0a 20 20  rOffset+8]);..  
22910 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
22920 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
22930 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
22940 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
22950 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 72 63 20  e, i);.      rc 
22960 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70  = reparentPage(p
22970 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65  Bt, get4byte(pCe
22980 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69 2c 20 75  ll), pPage, i, u
22990 70 64 61 74 65 50 74 72 6d 61 70 29 3b 0a 20 20  pdatePtrmap);.  
229a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
229b0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
229c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
229d0 3d 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70  = reparentPage(p
229e0 42 74 2c 20 69 52 69 67 68 74 2c 20 70 50 61 67  Bt, iRight, pPag
229f0 65 2c 20 69 2c 20 75 70 64 61 74 65 50 74 72 6d  e, i, updatePtrm
22a00 61 70 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ap);.    pPage->
22a10 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
22a20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22a30 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
22a40 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
22a50 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
22a60 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
22a70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
22a80 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
22a90 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
22aa0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
22ab0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
22ac0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
22ad0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
22ae0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
22af0 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
22b00 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
22b10 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
22b20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
22b30 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
22b40 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
22b50 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
22b60 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
22b70 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
22b80 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
22b90 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
22ba0 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20   sz){.  int i;  
22bb0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22bc0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
22bd0 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
22be0 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
22bf0 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
22c00 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
22c10 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
22c20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
22c30 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
22c40 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
22c50 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
22c60 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
22c70 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ] */..  assert( 
22c80 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
22c90 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
22ca0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
22cb0 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
22cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
22cd0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
22ce0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
22cf0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
22d00 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
22d10 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
22d20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
22d30 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
22d40 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61  a;.  ptr = &data
22d50 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
22d60 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70  et + 2*idx];.  p
22d70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
22d80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  );.  assert( pc>
22d90 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61  10 && pc+sz<=pPa
22da0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
22db0 69 7a 65 20 29 3b 0a 20 20 66 72 65 65 53 70 61  ize );.  freeSpa
22dc0 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
22dd0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31  );.  for(i=idx+1
22de0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
22df0 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a  ; i++, ptr+=2){.
22e00 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
22e10 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20  [2];.    ptr[1] 
22e20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20  = ptr[3];.  }.  
22e30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
22e40 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
22e50 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
22e60 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
22e70 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ll);.  pPage->nF
22e80 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61 67  ree += 2;.  pPag
22e90 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b  e->idxShift = 1;
22ea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
22eb0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
22ec0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
22ed0 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
22ee0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
22ef0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
22f00 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
22f10 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
22f20 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
22f30 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
22f40 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
22f50 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
22f60 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
22f70 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
22f80 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
22f90 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
22fa0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
22fb0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
22fc0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
22fd0 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
22fe0 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  >aOvfl[] and mak
22ff0 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
23000 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
23010 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
23020 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
23030 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
23040 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
23050 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
23060 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
23070 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
23080 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
23090 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
230a0 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
230b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
230c0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
230d0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
230e0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
230f0 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
23100 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
23110 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
23120 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
23130 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
23140 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
23150 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
23160 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
23170 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
23180 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
23190 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
231a0 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
231b0 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
231c0 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65  tic int insertCe
231d0 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
231e0 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20  Page,   /* Page 
231f0 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
23200 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69  e copying */.  i
23210 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20  nt i,           
23220 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63   /* New cell bec
23230 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65  omes the i-th ce
23240 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ll of the page *
23250 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
23260 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
23270 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c   of the new cell
23280 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20   */.  int sz,   
23290 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
232a0 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70   of content in p
232b0 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54  Cell */.  u8 *pT
232c0 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
232d0 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63  emp storage spac
232e0 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20  e for pCell, if 
232f0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e  needed */.  u8 n
23300 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a  Skip          /*
23310 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   Do not write th
23320 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
23330 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  tes of the cell 
23340 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b  */.){.  int idx;
23350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
23360 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
23370 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
23380 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
23390 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
233a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
233b0 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
233c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
233d0 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f  te of content fo
233e0 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61  r any cell in da
233f0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  ta[] */.  int en
23400 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
23410 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
23420 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
23430 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
23440 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20  /.  int ins;    
23450 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
23460 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e  n data[] where n
23470 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ew cell pointer 
23480 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  is inserted */. 
23490 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
234a0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
234b0 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20  o data[] of the 
234c0 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
234d0 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
234e0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
234f0 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
23500 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
23510 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
23520 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
23530 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
23540 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
23550 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tr;          /* 
23560 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20  Used for moving 
23570 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75  information arou
23580 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nd in data[] */.
23590 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
235a0 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
235b0 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
235c0 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
235d0 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72   sz==cellSizePtr
235e0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29  (pPage, pCell) )
235f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
23600 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
23610 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
23620 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
23630 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
23640 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
23650 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
23660 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
23670 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
23680 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
23690 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
236a0 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
236b0 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
236c0 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
236d0 20 20 61 73 73 65 72 74 28 20 6a 3c 73 69 7a 65    assert( j<size
236e0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29  of(pPage->aOvfl)
236f0 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
23700 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Ovfl[0]) );.    
23710 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
23720 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
23730 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
23740 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20 20  j].idx = i;.    
23750 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30  pPage->nFree = 0
23760 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
23770 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
23780 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
23790 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
237a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
237b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
237c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
237d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
237e0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
237f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
23800 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
23810 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68  ge->aData;.    h
23820 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
23830 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d  ffset;.    top =
23840 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
23850 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c  hdr+5]);.    cel
23860 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
23870 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
23880 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
23890 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
238a0 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20  ll + 2;.    ins 
238b0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
238c0 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20  *i;.    if( end 
238d0 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20  > top - sz ){.  
238e0 20 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61      defragmentPa
238f0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
23900 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
23910 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
23920 20 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64       assert( end
23930 20 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a   + sz <= top );.
23940 20 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20      }.    idx = 
23950 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
23960 61 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73  age, sz);.    as
23970 73 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20  sert( idx>0 );. 
23980 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c     assert( end <
23990 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
239a0 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20  [hdr+5]) );.    
239b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
239c0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
239d0 20 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70   -= 2;.    memcp
239e0 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69  y(&data[idx+nSki
239f0 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  p], pCell+nSkip,
23a00 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
23a10 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72  for(j=end-2, ptr
23a20 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73  =&data[j]; j>ins
23a30 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b  ; j-=2, ptr-=2){
23a40 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  .      ptr[0] = 
23a50 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
23a60 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b  tr[1] = ptr[-1];
23a70 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62  .    }.    put2b
23a80 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
23a90 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
23aa0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
23ab0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
23ac0 20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68      pPage->idxSh
23ad0 69 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  ift = 1;.#ifndef
23ae0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
23af0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
23b00 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
23b10 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
23b20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
23b30 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
23b40 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
23b50 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
23b60 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
23b70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
23b80 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
23b90 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
23ba0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
23bb0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
23bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
23bd0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
23be0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
23bf0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  nfo);.      asse
23c00 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
23c10 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
23c20 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
23c30 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
23c40 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e       if( (info.n
23c50 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74  Data+(pPage->int
23c60 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29  Key?0:info.nKey)
23c70 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  )>info.nLocal ){
23c80 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67  .        Pgno pg
23c90 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  noOvfl = get4byt
23ca0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
23cb0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
23cc0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
23cd0 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67  t(pPage->pBt, pg
23ce0 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  noOvfl, PTRMAP_O
23cf0 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d  VERFLOW1, pPage-
23d00 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
23d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23d20 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
23d30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
23d40 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
23d50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
23d60 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
23d70 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
23d80 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
23d90 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
23da0 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
23db0 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
23dc0 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
23dd0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
23de0 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
23df0 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
23e00 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
23e10 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
23e20 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
23e30 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
23e40 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
23e50 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
23e60 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
23e70 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
23e80 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
23e90 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
23ea0 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20   u16 *aSize     
23eb0 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
23ec0 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
23ed0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
23ee0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
23ef0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61  er */.  int tota
23f00 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74  lSize;    /* Tot
23f10 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
23f20 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64  ells */.  int hd
23f30 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  r;          /* I
23f40 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68 65 61  ndex of page hea
23f50 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  der */.  int cel
23f60 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64  lptr;      /* Ad
23f70 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
23f80 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
23f90 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
23fa0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
23fb0 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
23fc0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
23fd0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
23fe0 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  r the page */.. 
23ff0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
24000 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
24010 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24020 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
24030 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
24040 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d  );.  totalSize =
24050 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
24060 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
24070 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61    totalSize += a
24080 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61  Size[i];.  }.  a
24090 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65  ssert( totalSize
240a0 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  +2*nCell<=pPage-
240b0 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65  >nFree );.  asse
240c0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
240d0 3d 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72  ==0 );.  cellptr
240e0 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
240f0 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  fset;.  data = p
24100 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
24110 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
24120 66 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74  ffset;.  put2byt
24130 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
24140 6e 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43  nCell);.  if( nC
24150 65 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62  ell ){.    cellb
24160 6f 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  ody = allocateSp
24170 61 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c  ace(pPage, total
24180 53 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Size);.    asser
24190 74 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b  t( cellbody>0 );
241a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
241b0 67 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e  ge->nFree >= 2*n
241c0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  Cell );.    pPag
241d0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43  e->nFree -= 2*nC
241e0 65 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ell;.    for(i=0
241f0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
24200 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
24210 26 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20  &data[cellptr], 
24220 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20  cellbody);.     
24230 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65   memcpy(&data[ce
24240 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b  llbody], apCell[
24250 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20  i], aSize[i]);. 
24260 20 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20       cellptr += 
24270 32 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64  2;.      cellbod
24280 79 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y += aSize[i];. 
24290 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
242a0 20 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65   cellbody==pPage
242b0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
242c0 65 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  e );.  }.  pPage
242d0 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b  ->nCell = nCell;
242e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
242f0 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
24300 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
24310 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
24320 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
24330 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
24340 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
24350 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
24360 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
24370 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
24380 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
24390 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
243a0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
243b0 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
243c0 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
243d0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
243e0 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
243f0 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
24400 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
24410 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
24420 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
24430 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
24440 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
24450 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
24460 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
24470 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
24480 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
24490 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
244a0 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
244b0 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
244c0 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
244d0 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
244e0 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
244f0 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
24500 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
24510 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
24520 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
24530 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
24540 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
24550 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
24560 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
24570 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
24580 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
24590 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
245a0 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
245b0 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
245c0 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
245d0 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  nce */../* Forwa
245e0 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
245f0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
24600 63 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74  ce(MemPage*, int
24610 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
24620 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
24630 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
24640 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
24650 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
24660 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
24670 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
24680 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
24690 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
246a0 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
246b0 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
246c0 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
246d0 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
246e0 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
246f0 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
24700 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
24710 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
24720 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61  ead of trying ba
24730 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
24740 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
24750 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
24760 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
24770 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
24780 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
24790 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
247a0 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
247b0 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
247c0 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
247d0 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
247e0 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
247f0 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
24800 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
24810 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
24820 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
24830 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
24840 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
24850 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
24860 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
24870 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
24880 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
24890 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
248a0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
248b0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
248c0 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
248d0 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
248e0 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
248f0 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
24900 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
24910 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
24920 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
24930 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
24940 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
24950 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
24960 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70  Page, MemPage *p
24970 50 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  Parent){.  int r
24980 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  c;.  MemPage *pN
24990 65 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e  ew;.  Pgno pgnoN
249a0 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ew;.  u8 *pCell;
249b0 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20  .  u16 szCell;. 
249c0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
249d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
249e0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
249f0 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20  int parentIdx = 
24a00 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20  pParent->nCell; 
24a10 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77    /* pParent new
24a20 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
24a30 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72  dex */.  int par
24a40 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  entSize;        
24a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
24a60 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65  ze of new divide
24a70 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70  r cell */.  u8 p
24a80 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20  arentCell[64];  
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24aa0 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   Space for the n
24ab0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
24ac0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
24ad0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24ae0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
24af0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ex) );..  /* All
24b00 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
24b10 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65  . Insert the ove
24b20 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20  rflow cell from 
24b30 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20  pPage.  ** into 
24b40 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20  it. Then remove 
24b50 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
24b60 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20  l from pPage..  
24b70 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
24b80 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
24b90 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
24ba0 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
24bb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24bc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24bd0 20 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61   }.  pCell = pPa
24be0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
24bf0 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63  ll;.  szCell = c
24c00 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
24c10 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f  , pCell);.  zero
24c20 50 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65  Page(pNew, pPage
24c30 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61  ->aData[0]);.  a
24c40 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
24c50 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
24c60 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
24c70 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
24c80 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 61 72    /* Set the par
24c90 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 6c 79  ent of the newly
24ca0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
24cb0 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
24cc0 20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d   pNew->pParent =
24cd0 20 70 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69   pParent;.  sqli
24ce0 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
24cf0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a  ent->pDbPage);..
24d00 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75    /* pPage is cu
24d10 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68  rrently the righ
24d20 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t-child of pPare
24d30 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a  nt. Change this.
24d40 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65    ** so that the
24d50 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20   right-child is 
24d60 74 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c  the new page all
24d70 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64  ocated above and
24d80 0a 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74  .  ** pPage is t
24d90 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74  he next-to-right
24da0 20 63 68 69 6c 64 2e 20 0a 20 20 2a 2a 0a 20 20   child. .  **.  
24db0 2a 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72 65  ** Ignore the re
24dc0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
24dd0 65 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e  e call to fillIn
24de0 43 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43 65  Cell(). fillInCe
24df0 6c 6c 28 29 0a 20 20 2a 2a 20 6d 61 79 20 6f 6e  ll().  ** may on
24e00 6c 79 20 72 65 74 75 72 6e 20 6f 74 68 65 72 20  ly return other 
24e10 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
24e20 66 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  f it is required
24e30 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a   to allocate.  *
24e40 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  * one or more ov
24e50 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 53 69  erflow pages. Si
24e60 6e 63 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  nce an internal 
24e70 74 61 62 6c 65 20 42 2d 54 72 65 65 20 63 65 6c  table B-Tree cel
24e80 6c 20 0a 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65  l .  ** may neve
24e90 72 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74  r spill over ont
24ea0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
24eb0 67 65 20 28 69 74 20 69 73 20 61 20 6d 61 78 69  ge (it is a maxi
24ec0 6d 75 6d 20 6f 66 20 0a 20 20 2a 2a 20 31 33 20  mum of .  ** 13 
24ed0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c 20  bytes in size), 
24ee0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65 73  it is not necces
24ef0 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68  sary to check th
24f00 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 20  e return code.. 
24f10 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72   **.  ** Similar
24f20 6c 79 2c 20 74 68 65 20 69 6e 73 65 72 74 43 65  ly, the insertCe
24f30 6c 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61  ll() function ca
24f40 6e 6e 6f 74 20 66 61 69 6c 20 69 66 20 74 68 65  nnot fail if the
24f50 20 70 61 67 65 0a 20 20 2a 2a 20 62 65 69 6e 67   page.  ** being
24f60 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69   inserted into i
24f70 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 61 62  s already writab
24f80 6c 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  le and the cell 
24f90 64 6f 65 73 20 6e 6f 74 20 0a 20 20 2a 2a 20 63  does not .  ** c
24fa0 6f 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66 6c  ontain an overfl
24fb0 6f 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20 69  ow pointer. So i
24fc0 67 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75 72  gnore this retur
24fd0 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 2a 2f  n code too..  */
24fe0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24ff0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70  ->nCell>0 );.  p
25000 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
25010 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
25020 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  ell-1);.  sqlite
25030 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
25040 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
25050 20 26 69 6e 66 6f 29 3b 0a 20 20 66 69 6c 6c 49   &info);.  fillI
25060 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  nCell(pParent, p
25070 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e  arentCell, 0, in
25080 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30  fo.nKey, 0, 0, 0
25090 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a  , &parentSize);.
250a0 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74    assert( parent
250b0 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 61 73 73  Size<64 );.  ass
250c0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
250d0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
250e0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
250f0 3b 0a 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  ;.  insertCell(p
25100 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64  Parent, parentId
25110 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70  x, parentCell, p
25120 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29  arentSize, 0, 4)
25130 3b 0a 20 20 70 75 74 34 62 79 74 65 28 66 69 6e  ;.  put4byte(fin
25140 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
25150 61 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29  arent,parentIdx)
25160 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
25170 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72    put4byte(&pPar
25180 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
25190 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
251a0 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 20 20 2f  , pgnoNew);..  /
251b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
251c0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
251d0 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
251e0 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a   pointer map.  *
251f0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
25200 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
25210 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
25220 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20   from the .  ** 
25230 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
25240 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
25250 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
25260 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
25270 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
25280 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
25290 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
252a0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
252b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
252c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
252d0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
252e0 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20  l(pNew, 0);.    
252f0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
25300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25310 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
25320 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  w);.      return
25330 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
25340 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
25350 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
25360 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62  e new page and b
25370 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
25380 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20  t page,.  ** in 
25390 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72  case the divider
253a0 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63   cell inserted c
253b0 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f  aused it to beco
253c0 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a  me overfull..  *
253d0 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  /.  releasePage(
253e0 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  pNew);.  return 
253f0 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c  balance(pParent,
25400 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   0);.}.#endif /*
25410 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
25420 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a  CKBALANCE */../*
25430 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25440 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20 43   redistributes C
25450 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e  ells on pPage an
25460 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62  d up to NN*2 sib
25470 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67  lings.** of pPag
25480 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61  e so that all pa
25490 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74  ges have about t
254a0 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  he same amount o
254b0 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a  f free space..**
254c0 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c   Usually NN sibl
254d0 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73  ings on either s
254e0 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73 20  ide of pPage is 
254f0 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
25500 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68  ncing,.** though
25510 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d   more siblings m
25520 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
25530 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67 65  ne side if pPage
25540 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
25550 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
25560 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49  f its parent.  I
25570 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77 65  f pPage has fewe
25580 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c  r than 2*NN sibl
25590 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69  ings.** (somethi
255a0 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
255b0 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61 67  y happen if pPag
255c0 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  e is the root pa
255d0 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c  ge or a .** chil
255e0 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20  d of root) then 
255f0 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
25600 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70 61  blings participa
25610 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
25620 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
25630 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
25640 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74  s of pPage might
25650 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
25660 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e   decreased by on
25670 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61  e or.** two in a
25680 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70  n effort to keep
25690 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75   pages nearly fu
256a0 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20  ll but not over 
256b0 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70  full. The root p
256c0 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61  age.** is specia
256d0 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64  l and is allowed
256e0 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d   to be nearly em
256f0 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69 73  pty. If pPage is
25700 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61   .** the root pa
25710 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70  ge, then the dep
25720 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d  th of the tree m
25730 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
25740 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65  d.** or decrease
25750 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63  d by one, as nec
25760 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20  essary, to keep 
25770 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72  the root page fr
25780 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72  om being.** over
25790 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65  full or complete
257a0 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  ly empty..**.** 
257b0 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
257c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
257d0 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
257e0 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he Cells on pPag
257f0 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61  e.** might not a
25800 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65  ctually be store
25810 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  d in pPage->aDat
25820 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68  a[].  This can h
25830 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20  appen.** if the 
25840 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
25850 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a  .  Part of the j
25860 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
25870 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65  ne is to.** make
25880 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20   sure all Cells 
25890 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61  for pPage once a
258a0 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67  gain fit in pPag
258b0 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a  e->aData[]..**.*
258c0 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
258d0 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
258e0 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61   siblings of pPa
258f0 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f  ge, the parent o
25900 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74  f pPage.** might
25910 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
25920 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20   or underfull.  
25930 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c  If that happens,
25940 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
25950 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
25960 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74  recursively on t
25970 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a  he parent..**.**
25980 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
25990 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
259a0 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20  eason, it might 
259b0 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61  leave the databa
259c0 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75  se.** in a corru
259d0 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20  pted state.  So 
259e0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
259f0 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62  fails, the datab
25a00 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ase should.** be
25a10 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
25a20 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
25a30 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50  nce_nonroot(MemP
25a40 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d  age *pPage){.  M
25a50 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
25a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25a70 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
25a80 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
25a90 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
25aa0 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
25ab0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
25ac0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ae0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
25af0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
25b00 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
25b10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
25b20 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
25b30 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
25b40 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
25b50 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt nOld;        
25b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25b70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
25b80 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
25b90 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
25ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25bb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
25bc0 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
25bd0 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20  nt nDiv;        
25be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25bf0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
25c00 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69  n apDiv[] */.  i
25c10 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
25c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
25c30 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
25c40 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
25c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25c60 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65  * Index of pPage
25c70 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
25c80 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78  ll[] */.  int nx
25c90 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
25ca0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64         /* Next d
25cb0 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70  ivider slot in p
25cc0 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
25cd0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cf0 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
25d00 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  code */.  int le
25d10 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20  afCorrection;   
25d20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70         /* 4 if p
25d30 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
25d40 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69   0 if not */.  i
25d50 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20  nt leafData;    
25d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25d70 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20  rue if pPage is 
25d80 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46  a leaf of a LEAF
25d90 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69  DATA tree */.  i
25da0 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20  nt usableSpace; 
25db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
25dc0 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65  ytes in pPage be
25dd0 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20  yond the header 
25de0 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61  */.  int pageFla
25df0 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
25e00 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50    /* Value of pP
25e10 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f  age->aData[0] */
25e20 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b  .  int subtotal;
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e40 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62  /* Subtotal of b
25e50 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e  ytes in cells on
25e60 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   one page */.  i
25e70 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20  nt iSpace1 = 0; 
25e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
25e90 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
25ea0 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f   of aSpace1[] */
25eb0 0a 20 20 69 6e 74 20 69 53 70 61 63 65 32 20 3d  .  int iSpace2 =
25ec0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
25ed0 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
25ee0 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 32 5b  byte of aSpace2[
25ef0 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72  ] */.  int szScr
25f00 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
25f10 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
25f20 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65  cratch memory re
25f30 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  quested */.  Mem
25f40 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
25f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
25f60 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
25f70 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50   siblings */.  P
25f80 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b  gno pgnoOld[NB];
25f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
25fa0 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
25fb0 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f  each page in apO
25fc0 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ld[] */.  MemPag
25fd0 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20  e *apCopy[NB];  
25fe0 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74         /* Privat
25ff0 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c  e copies of apOl
26000 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d  d[] pages */.  M
26010 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
26020 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +2];        /* p
26030 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
26040 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
26050 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
26060 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b  Pgno pgnoNew[NB+
26070 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2];          /* 
26080 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
26090 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
260a0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  New[] */.  u8 *a
260b0 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pDiv[NB];       
260c0 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
260d0 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
260e0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
260f0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
26100 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
26110 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
26120 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
26130 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
26140 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
26150 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
26160 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
26170 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
26180 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
26190 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
261a0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
261b0 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
261c0 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261e0 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
261f0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
26200 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
26210 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  *aCopy[NB];     
26220 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
26230 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66   holding data of
26240 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75   apCopy[] */.  u
26250 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
26260 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
26270 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
26280 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66 6f  iders cells befo
26290 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20  re balance */.  
262a0 75 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30 3b  u8 *aSpace2 = 0;
262b0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
262c0 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69 76  for overflow div
262d0 69 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74 65  iders cells afte
262e0 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75  r balance */.  u
262f0 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20  8 *aFrom = 0;.. 
26300 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26310 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
26320 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
26330 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69  ;..  /* .  ** Fi
26340 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nd the parent pa
26350 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
26360 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
26370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
26380 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
26390 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
263a0 50 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e  Page) || pPage->
263b0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
263c0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
263d0 42 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20  Bt;.  pParent = 
263e0 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
263f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
26400 74 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  t );.  if( SQLIT
26410 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
26420 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
26430 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29  arent->pDbPage))
26440 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
26450 63 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 28  c;.  }..  TRACE(
26460 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
26470 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
26480 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
26490 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
264a0 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  gno));..#ifndef 
264b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
264c0 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20  KBALANCE.  /*.  
264d0 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61 73  ** A special cas
264e0 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74  e:  If a new ent
264f0 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ry has just been
26500 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61   inserted into a
26510 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61  .  ** table (tha
26520 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77 69  t is, a btree wi
26530 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20  th integer keys 
26540 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20  and all data at 
26550 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a  the leaves).  **
26560 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74   and the new ent
26570 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ry is the right-
26580 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  most entry in th
26590 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20 74  e tree (it has t
265a0 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  he.  ** largest 
265b0 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74 68  key) then use th
265c0 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63  e special balanc
265d0 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e  e_quick() routin
265e0 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e  e for.  ** balan
265f0 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71  cing.  balance_q
26600 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66  uick() is much f
26610 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74  aster and result
26620 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20  s in a tighter. 
26630 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64   ** packing of d
26640 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  ata in the commo
26650 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  n case..  */.  i
26660 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26  f( pPage->leaf &
26670 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  &.      pPage->i
26680 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70  ntKey &&.      p
26690 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
266a0 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  =1 &&.      pPag
266b0 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  e->aOvfl[0].idx=
266c0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26  =pPage->nCell &&
266d0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50  .      pPage->pP
266e0 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26  arent->pgno!=1 &
266f0 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65  &.      get4byte
26700 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
26710 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
26720 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e  set+8])==pPage->
26730 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73  pgno.  ){.    as
26740 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
26750 4b 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20  Key );.    /*.  
26760 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    ** TODO: Check
26770 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f   the siblings to
26780 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61   the left of pPa
26790 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68  ge. It may be th
267a0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61  at.    ** they a
267b0 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20  re not full and 
267c0 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72  no new page is r
267d0 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
267e0 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e      return balan
267f0 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20  ce_quick(pPage, 
26800 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65  pParent);.  }.#e
26810 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49  ndif..  if( SQLI
26820 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
26830 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
26840 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20  Page->pDbPage)) 
26850 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
26860 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
26870 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69   Find the cell i
26880 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
26890 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69  e whose left chi
268a0 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20  ld points back. 
268b0 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54   ** to pPage.  T
268c0 68 65 20 22 69 64 78 22 20 76 61 72 69 61 62 6c  he "idx" variabl
268d0 65 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  e is the index o
268e0 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66  f that cell.  If
268f0 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74   pPage.  ** is t
26900 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69  he rightmost chi
26910 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68  ld of pParent th
26920 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70 50  en set idx to pP
26930 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20  arent->nCell .  
26940 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  */.  if( pParent
26950 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20  ->idxShift ){.  
26960 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
26970 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
26980 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
26990 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61   pgno==sqlite3Pa
269a0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
269b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
269c0 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20  .    for(idx=0; 
269d0 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  idx<pParent->nCe
269e0 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20  ll; idx++){.    
269f0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 66    if( get4byte(f
26a00 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
26a10 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a   idx))==pgno ){.
26a20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26a30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26a40 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61   assert( idx<pPa
26a50 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20  rent->nCell.    
26a60 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34           || get4
26a70 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
26a80 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
26a90 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e  rOffset+8])==pgn
26aa0 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o );.  }else{.  
26ab0 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69    idx = pPage->i
26ac0 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20  dxParent;.  }.. 
26ad0 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c   /*.  ** Initial
26ae0 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ize variables so
26af0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
26b00 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20   safe to jump.  
26b10 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62  ** directly to b
26b20 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61  alance_cleanup a
26b30 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20  t any moment..  
26b40 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77  */.  nOld = nNew
26b50 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
26b60 61 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d  agerRef(pParent-
26b70 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a  >pDbPage);..  /*
26b80 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69  .  ** Find sibli
26b90 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50 61 67  ng pages to pPag
26ba0 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20  e and the cells 
26bb0 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74 20  in pParent that 
26bc0 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20  divide.  ** the 
26bd0 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74  siblings.  An at
26be0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
26bf0 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
26c00 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a  s on either.  **
26c10 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
26c20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
26c30 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
26c40 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
26c50 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74   if.  ** pPage t
26c60 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74  here are fewer t
26c70 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20  han NN siblings 
26c80 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64  on the other sid
26c90 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20  e.  If pParent. 
26ca0 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
26cb0 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
26cc0 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
26cd0 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
26ce0 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69  ken..  */.  nxDi
26cf0 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20  v = idx - NN;.  
26d00 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e  if( nxDiv + NB >
26d10 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
26d20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70  ){.    nxDiv = p
26d30 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20  Parent->nCell - 
26d40 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66  NB + 1;.  }.  if
26d50 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20  ( nxDiv<0 ){.   
26d60 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a   nxDiv = 0;.  }.
26d70 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f    nDiv = 0;.  fo
26d80 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20  r(i=0, k=nxDiv; 
26d90 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b  i<NB; i++, k++){
26da0 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65  .    if( k<pPare
26db0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
26dc0 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69     apDiv[i] = fi
26dd0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
26de0 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b  k);.      nDiv++
26df0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
26e00 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29  !pParent->leaf )
26e10 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  ;.      pgnoOld[
26e20 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  i] = get4byte(ap
26e30 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c  Div[i]);.    }el
26e40 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e  se if( k==pParen
26e50 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
26e60 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67    pgnoOld[i] = g
26e70 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
26e80 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
26e90 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
26ea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26eb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
26ec0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
26ed0 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f  tPage(pBt, pgnoO
26ee0 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d  ld[i], &apOld[i]
26ef0 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , pParent);.    
26f00 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
26f10 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
26f20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78     apOld[i]->idx
26f30 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20  Parent = k;.    
26f40 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20  apCopy[i] = 0;. 
26f50 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f     assert( i==nO
26f60 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b  ld );.    nOld++
26f70 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20  ;.    nMaxCells 
26f80 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  += 1+apOld[i]->n
26f90 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  Cell+apOld[i]->n
26fa0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20  Overflow;.  }.. 
26fb0 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c   /* Make nMaxCel
26fc0 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ls a multiple of
26fd0 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70   4 in order to p
26fe0 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20  reserve 8-byte. 
26ff0 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f   ** alignment */
27000 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28  .  nMaxCells = (
27010 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e  nMaxCells + 3)&~
27020 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  3;..  /*.  ** Al
27030 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
27040 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
27050 65 73 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72 61  es.  */.  szScra
27060 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
27070 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
27080 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
27090 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
270a0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
270b0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
270c0 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
270d0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
270e0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52 4f  ll */.     + (RO
270f0 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
27100 61 67 65 29 29 2b 70 42 74 2d 3e 70 61 67 65 53  age))+pBt->pageS
27110 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f 70  ize)*NB  /* aCop
27120 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d  y */.     + pBt-
27130 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20  >pageSize       
27140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27150 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
27160 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53  e1 */.     + (IS
27170 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61  AUTOVACUUM ? nMa
27180 78 43 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20 20  xCells : 0);    
27190 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f           /* aFro
271a0 6d 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  m */.  apCell = 
271b0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
271c0 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
271d0 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
271e0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
271f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27200 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
27210 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
27220 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
27230 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
27240 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75  .  aCopy[0] = (u
27250 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
27260 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
27270 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75   ((aCopy[0] - (u
27280 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
27290 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
272a0 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
272b0 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b  ed */.  for(i=1;
272c0 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<NB; i++){.   
272d0 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f   aCopy[i] = &aCo
272e0 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  py[i-1][pBt->pag
272f0 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
27300 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
27310 20 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43      assert( ((aC
27320 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70  opy[i] - (u8*)ap
27330 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b  Cell) & 7)==0 );
27340 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
27350 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f  ment required */
27360 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 31 20 3d  .  }.  aSpace1 =
27370 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42   &aCopy[NB-1][pB
27380 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
27390 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
273a0 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e))];.  assert( 
273b0 28 28 61 53 70 61 63 65 31 20 2d 20 28 75 38 2a  ((aSpace1 - (u8*
273c0 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30  )apCell) & 7)==0
273d0 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c   ); /* 8-byte al
273e0 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64  ignment required
273f0 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
27400 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 61 46  VACUUM ){.    aF
27410 72 6f 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70  rom = &aSpace1[p
27420 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20  Bt->pageSize];. 
27430 20 7d 0a 20 20 61 53 70 61 63 65 32 20 3d 20 73   }.  aSpace2 = s
27440 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
27450 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  (pBt->pageSize);
27460 0a 20 20 69 66 28 20 61 53 70 61 63 65 32 3d 3d  .  if( aSpace2==
27470 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
27480 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
27490 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
274a0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  anup;.  }.  .  /
274b0 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69  *.  ** Make copi
274c0 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  es of the conten
274d0 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69  t of pPage and i
274e0 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f  ts siblings into
274f0 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68   aOld[]..  ** Th
27500 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
27510 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
27520 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
27530 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a  opies rather.  *
27540 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
27550 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
27560 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
27570 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
27580 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f  e.  ** process o
27590 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
275a0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ten..  */.  for(
275b0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
275c0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
275d0 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20  p = apCopy[i] = 
275e0 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b  (MemPage*)aCopy[
275f0 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i];.    memcpy(p
27600 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
27610 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
27620 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f    p->aData = (vo
27630 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d  id*)&p[1];.    m
27640 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20  emcpy(p->aData, 
27650 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
27660 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
27670 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
27680 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
27690 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
276a0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
276b0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
276c0 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
276d0 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
276e0 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
276f0 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
27700 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
27710 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
27720 20 66 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20   form aSpace1[] 
27730 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
27740 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
27750 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
27760 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
27770 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
27780 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
27790 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
277a0 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
277b0 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
277c0 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
277d0 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
277e0 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
277f0 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
27800 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
27810 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
27820 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
27830 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
27840 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
27850 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
27860 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
27870 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
27880 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
27890 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
278a0 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
278b0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
278c0 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
278d0 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
278e0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
278f0 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
27900 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
27910 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
27920 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
27930 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
27940 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
27950 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
27960 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
27970 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30    */.  nCell = 0
27980 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ;.  leafCorrecti
27990 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  on = pPage->leaf
279a0 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
279b0 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 3b   pPage->hasData;
279c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
279d0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  ld; i++){.    Me
279e0 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
279f0 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Copy[i];.    int
27a00 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
27a10 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
27a20 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
27a30 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
27a40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27a50 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
27a60 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
27a70 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
27a80 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
27a90 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
27aa0 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
27ab0 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
27ac0 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20  ll[nCell]);.    
27ad0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
27ae0 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  UM ){.        in
27af0 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72  t a;.        aFr
27b00 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20  om[nCell] = i;. 
27b10 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20         for(a=0; 
27b20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  a<pOld->nOverflo
27b30 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; a++){.       
27b40 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76     if( pOld->aOv
27b50 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43  fl[a].pCell==apC
27b60 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20  ell[nCell] ){.  
27b70 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b            aFrom[
27b80 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20  nCell] = 0xFF;. 
27b90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
27ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27bc0 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
27bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e     }.    if( i<n
27be0 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 75  Old-1 ){.      u
27bf0 31 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65  16 sz = cellSize
27c00 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
27c10 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  iv[i]);.      if
27c20 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
27c30 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68        /* With th
27c40 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c  e LEAFDATA flag,
27c50 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68   pParent cells h
27c60 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73  old only INTKEYs
27c70 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
27c80 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20   are duplicates 
27c90 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63  of keys on the c
27ca0 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20  hild pages.  We 
27cb0 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20  need to remove. 
27cc0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69         ** the di
27cd0 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
27ce0 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68   pParent, but th
27cf0 65 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  e dividers cells
27d00 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20   are not.       
27d10 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43   ** added to apC
27d20 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68  ell[] because th
27d30 65 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ey are duplicate
27d40 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73  s of child cells
27d50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27d60 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
27d70 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
27d80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
27d90 20 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d          u8 *pTem
27da0 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
27db0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
27dc0 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  ls );.        sz
27dd0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
27de0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
27df0 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
27e00 65 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70  e1];.        iSp
27e10 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace1 += sz;.    
27e20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
27e30 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
27e40 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
27e50 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d  t( iSpace1<=pBt-
27e60 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
27e70 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
27e80 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
27e90 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
27ea0 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
27eb0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
27ec0 20 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55          if( ISAU
27ed0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
27ee0 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
27ef0 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
27f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 72 6f     }.        dro
27f10 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
27f20 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
27f30 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
27f40 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69   -= leafCorrecti
27f50 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  on;.        asse
27f60 72 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65  rt( get4byte(pTe
27f70 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20  mp)==pgnoOld[i] 
27f80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
27f90 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pOld->leaf ){.  
27fa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27fb0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
27fc0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 );.          /
27fd0 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
27fe0 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
27ff0 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
28000 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
28010 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
28020 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
28030 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20  cell */.        
28040 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b    memcpy(apCell[
28050 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61  nCell], &pOld->a
28060 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66  Data[pOld->hdrOf
28070 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20  fset+8], 4);.   
28080 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
280a0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
280b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
280c0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34   szCell[nCell]<4
280d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
280e0 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
280f0 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65  any cells smalle
28100 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20  r than 4 bytes. 
28110 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  */.            s
28120 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
28130 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
28140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28150 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
28160 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28170 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74  .  ** Figure out
28180 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
28190 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68  ages needed to h
281a0 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65  old all nCell ce
281b0 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20  lls..  ** Store 
281c0 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22  this number in "
281d0 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74  k".  Also comput
281e0 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20  e szNew[] which 
281f0 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a  is the total.  *
28200 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  * size of all ce
28210 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  lls on the i-th 
28220 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b  page and cntNew[
28230 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  ] which is the i
28240 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43  ndex.  ** in apC
28250 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c  ell[] of the cel
28260 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70  l that divides p
28270 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20  age i from page 
28280 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e  i+1.  .  ** cntN
28290 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75  ew[k] should equ
282a0 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20  al nCell..  **. 
282b0 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75   ** Values compu
282c0 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
282d0 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  k:.  **.  **    
282e0 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f         k: The to
282f0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  tal number of si
28300 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a  bling pages.  **
28310 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70      szNew[i]: Sp
28320 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65  aced used on the
28330 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
28340 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65  ge..  **   cntNe
28350 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61  w[i]: Index in a
28360 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65  pCell[] and szCe
28370 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72  ll[] for the fir
28380 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20  st cell to.  ** 
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
283a0 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d   right of the i-
283b0 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
283c0 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63  .  ** usableSpac
283d0 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  e: Number of byt
283e0 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69  es of space avai
283f0 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69  lable on each si
28400 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a  bling..  ** .  *
28410 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20  /.  usableSpace 
28420 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
28430 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72  e - 12 + leafCor
28440 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73  rection;.  for(s
28450 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69  ubtotal=k=i=0; i
28460 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
28470 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78    assert( i<nMax
28480 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62  Cells );.    sub
28490 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b  total += szCell[
284a0 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20  i] + 2;.    if( 
284b0 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c  subtotal > usabl
284c0 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eSpace ){.      
284d0 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
284e0 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  tal - szCell[i];
284f0 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d  .      cntNew[k]
28500 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20   = i;.      if( 
28510 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b  leafData ){ i--;
28520 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61   }.      subtota
28530 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b  l = 0;.      k++
28540 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  ;.    }.  }.  sz
28550 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
28560 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
28570 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
28580 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
28590 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
285a0 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
285b0 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
285c0 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
285d0 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
285e0 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
285f0 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
28600 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
28610 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
28620 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
28630 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
28640 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
28650 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
28660 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
28670 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
28680 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
28690 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
286a0 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
286b0 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
286c0 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
286d0 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
286e0 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
286f0 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
28700 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
28710 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
28720 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
28730 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
28740 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
28750 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
28760 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
28770 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
28780 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
28790 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
287a0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
287b0 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
287c0 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
287d0 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
287e0 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
287f0 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
28800 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
28810 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
28820 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
28830 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
28840 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
28850 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
28860 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
28870 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
28880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28890 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
288a0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
288b0 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
288c0 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
288d0 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
288e0 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
288f0 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
28900 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
28910 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
28920 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
28930 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
28940 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   || szRight+szCe
28950 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
28960 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b  (szCell[r]+2) ){
28970 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
28980 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
28990 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
289a0 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
289b0 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
289c0 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
289d0 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
289e0 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
289f0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
28a00 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
28a10 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
28a20 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
28a30 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
28a40 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
28a50 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
28a60 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
28a70 20 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a   we are the.  **
28a80 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
28a90 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
28aa0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
28ab0 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
28ac0 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
28ad0 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
28ae0 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
28af0 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
28b00 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e  /.  assert( cntN
28b10 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72  ew[0]>0 || (pPar
28b20 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20  ent->pgno==1 && 
28b30 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
28b40 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  0) );..  /*.  **
28b50 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20   Allocate k new 
28b60 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c  pages.  Reuse ol
28b70 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f  d pages where po
28b80 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  ssible..  */.  a
28b90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
28ba0 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c  no>1 );.  pageFl
28bb0 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ags = pPage->aDa
28bc0 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
28bd0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
28be0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
28bf0 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
28c00 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
28c10 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
28c20 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
28c30 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69  w[i] = pgnoOld[i
28c40 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69  ];.      apOld[i
28c50 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  ] = 0;.      rc 
28c60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
28c70 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ite(pNew->pDbPag
28c80 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  e);.      nNew++
28c90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
28ca0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
28cb0 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
28cc0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28cd0 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
28ce0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
28cf0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
28d00 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e  &pgnoNew[i], pgn
28d10 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20  oNew[i-1], 0);. 
28d20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
28d30 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
28d40 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  up;.      apNew[
28d50 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  i] = pNew;.     
28d60 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20   nNew++;.    }. 
28d70 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e   }..  /* Free an
28d80 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74  y old pages that
28d90 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64   were not reused
28da0 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20   as new pages.. 
28db0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e   */.  while( i<n
28dc0 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Old ){.    rc = 
28dd0 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
28de0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ]);.    if( rc )
28df0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
28e00 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61  eanup;.    relea
28e10 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
28e20 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d  ;.    apOld[i] =
28e30 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d   0;.    i++;.  }
28e40 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20  ..  /*.  ** Put 
28e50 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e  the new pages in
28e60 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
28e70 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f  .  This helps to
28e80 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69  .  ** keep entri
28e90 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
28ea0 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20  ile in order so 
28eb0 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a  that a scan.  **
28ec0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
28ed0 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
28ee0 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e  hrough the file.
28ef0 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74    That.  ** in t
28f00 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70  urn helps the op
28f10 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74  erating system t
28f20 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a  o deliver pages.
28f30 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69    ** from the di
28f40 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e  sk more rapidly.
28f50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28  .  **.  ** An O(
28f60 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73  n^2) insertion s
28f70 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ort algorithm is
28f80 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65   used, but since
28f90 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72  .  ** n is never
28fa0 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61   more than NB (a
28fb0 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29   small constant)
28fc0 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20  , that should.  
28fd0 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62  ** not be a prob
28fe0 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  lem..  **.  ** W
28ff0 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20  hen NB==3, this 
29000 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  one optimization
29010 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62   makes the datab
29020 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32  ase.  ** about 2
29030 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61  5% faster for la
29040 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61  rge insertions a
29050 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20  nd deletions..  
29060 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
29070 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  k-1; i++){.    i
29080 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65  nt minV = pgnoNe
29090 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69  w[i];.    int mi
290a0 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
290b0 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
290c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
290d0 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64  New[j]<(unsigned
290e0 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
290f0 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
29100 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65     minV = pgnoNe
29110 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  w[j];.      }.  
29120 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49    }.    if( minI
29130 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >i ){.      int 
29140 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  t;.      MemPage
29150 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20   *pT;.      t = 
29160 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  pgnoNew[i];.    
29170 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b    pT = apNew[i];
29180 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69  .      pgnoNew[i
29190 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49  ] = pgnoNew[minI
291a0 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
291b0 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
291c0 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d  .      pgnoNew[m
291d0 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20  inI] = t;.      
291e0 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
291f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
29200 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
29210 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65  ld: %d %d %d  ne
29220 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29  w: %d(%d) %d(%d)
29230 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
29240 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67  d(%d)\n",.    pg
29250 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e  noOld[0], .    n
29260 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64  Old>=2 ? pgnoOld
29270 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c  [1] : 0,.    nOl
29280 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32  d>=3 ? pgnoOld[2
29290 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e  ] : 0,.    pgnoN
292a0 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c  ew[0], szNew[0],
292b0 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70  .    nNew>=2 ? p
292c0 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e  gnoNew[1] : 0, n
292d0 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
292e0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
292f0 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20  =3 ? pgnoNew[2] 
29300 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73  : 0, nNew>=3 ? s
29310 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  zNew[2] : 0,.   
29320 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e   nNew>=4 ? pgnoN
29330 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[3] : 0, nNew>
29340 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20  =4 ? szNew[3] : 
29350 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f  0,.    nNew>=5 ?
29360 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c   pgnoNew[4] : 0,
29370 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77   nNew>=5 ? szNew
29380 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a  [4] : 0));..  /*
29390 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
293a0 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
293b0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
293c0 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
293d0 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
293e0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
293f0 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
29400 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
29410 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
29420 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
29430 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
29440 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
29450 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
29460 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
29470 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
29480 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
29490 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
294a0 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77  w->pgno==pgnoNew
294b0 5b 69 5d 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  [i] );.    zeroP
294c0 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
294d0 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  ags);.    assemb
294e0 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
294f0 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
29500 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
29510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29520 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
29530 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
29540 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
29550 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
29560 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
29570 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
29580 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
29590 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
295a0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
295b0 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a  p entries.    **
295c0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
295d0 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74  he siblings that
295e0 20 77 65 72 65 20 72 65 61 72 72 61 6e 67 65 64   were rearranged
295f0 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20  . These can be: 
29600 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c  left.    ** chil
29610 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74  dren of cells, t
29620 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
29630 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f  f the page, or o
29640 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20  verflow pages.  
29650 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
29660 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f  by cells..    */
29670 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
29680 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 66  ACUUM ){.      f
29690 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77  or(k=j; k<cntNew
296a0 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  [i]; k++){.     
296b0 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61     assert( k<nMa
296c0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
296d0 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d    if( aFrom[k]==
296e0 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61  0xFF || apCopy[a
296f0 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d  From[k]]->pgno!=
29700 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
29710 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
29720 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c  mapPutOvfl(pNew,
29730 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20   k-j);.         
29740 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29750 4f 4b 20 26 26 20 6c 65 61 66 43 6f 72 72 65 63  OK && leafCorrec
29760 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tion==0 ){.     
29770 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
29780 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62  apPut(pBt, get4b
29790 79 74 65 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20  yte(apCell[k]), 
297a0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e  PTRMAP_BTREE, pN
297b0 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ew->pgno);.     
297c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
297d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
297e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
297f0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
29800 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
29810 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29820 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
29830 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
29840 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
29850 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
29860 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
29870 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
29880 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
29890 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
298a0 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
298b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
298c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c     */.    if( i<
298d0 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c  nNew-1 && j<nCel
298e0 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
298f0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
29900 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
29910 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
29920 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
29930 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
29940 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
29950 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
29960 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
29970 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  n;.      pTemp =
29980 20 26 61 53 70 61 63 65 32 5b 69 53 70 61 63 65   &aSpace2[iSpace
29990 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  2];.      if( !p
299a0 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  New->leaf ){.   
299b0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
299c0 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65  w->aData[8], pCe
299d0 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ll, 4);.        
299e0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
299f0 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 61   .         && (a
29a00 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c  From[j]==0xFF ||
29a10 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d   apCopy[aFrom[j]
29a20 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  ]->pgno!=pNew->p
29a30 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  gno).        ){.
29a40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
29a50 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
29a60 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 50  t4byte(pCell), P
29a70 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
29a80 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  w->pgno);.      
29a90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29aa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29ab0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
29ac0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
29ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29ae0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
29af0 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
29b00 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74       /* If the t
29b10 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61  ree is a leaf-da
29b20 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65  ta tree, and the
29b30 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65   siblings are le
29b40 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a  aves, .        *
29b50 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  * then there is 
29b60 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  no divider cell 
29b70 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73  in apCell[]. Ins
29b80 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65  tead, the divide
29b90 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  r .        ** ce
29ba0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  ll consists of t
29bb0 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66  he integer key f
29bc0 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  or the right-mos
29bd0 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20  t cell of .     
29be0 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e     ** the siblin
29bf0 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64  g-page assembled
29c00 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20   above only..   
29c10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29c20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
29c30 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20         j--;.    
29c40 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
29c50 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65  ParseCellPtr(pNe
29c60 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69  w, apCell[j], &i
29c70 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43  nfo);.        pC
29c80 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
29c90 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28       fillInCell(
29ca0 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20  pParent, pCell, 
29cb0 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c  0, info.nKey, 0,
29cc0 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20   0, 0, &sz);.   
29cd0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
29ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29cf0 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
29d00 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
29d10 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
29d20 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
29d30 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
29d40 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
29d50 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
29d60 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
29d70 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
29d80 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
29d90 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
29da0 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
29db0 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
29dc0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
29dd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
29de0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
29df0 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
29e00 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
29e10 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
29e20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
29e30 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
29e40 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
29e50 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
29e60 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
29e70 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
29e80 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
29e90 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
29ea0 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
29eb0 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
29ec0 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
29ed0 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
29ee0 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
29ef0 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
29f00 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
29f10 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
29f20 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
29f30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
29f40 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
29f50 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
29f60 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
29f70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29f80 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
29f90 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
29fa0 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
29fb0 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
29fc0 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
29fd0 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
29fe0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
29ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a000 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20  Space2 += sz;.  
2a010 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
2a020 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
2a030 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2a040 20 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70   iSpace2<=pBt->p
2a050 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
2a060 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2a070 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c  (pParent, nxDiv,
2a080 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d   pCell, sz, pTem
2a090 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28  p, 4);.      if(
2a0a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a0b0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2a0c0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75 74  eanup;.      put
2a0d0 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2a0e0 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e  owCell(pParent,n
2a0f0 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e  xDiv), pNew->pgn
2a100 6f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  o);..      /* If
2a110 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2a120 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2a130 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66  , and not a leaf
2a140 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20  -data tree,.    
2a150 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65    ** then update
2a160 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2a170 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66   with an entry f
2a180 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
2a190 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  page.      ** th
2a1a0 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74  at the cell just
2a1b0 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73   inserted points
2a1c0 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20   to (if any)..  
2a1d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2a1e0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26   ISAUTOVACUUM &&
2a1f0 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20   !leafData ){.  
2a200 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2a210 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74  pPutOvfl(pParent
2a220 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20  , nxDiv);.      
2a230 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2a250 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2a260 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
2a270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
2a280 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b  ++;.      nxDiv+
2a290 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
2a2a0 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
2a2b0 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74  -map entry for t
2a2c0 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
2a2d0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  age. */.    if( 
2a2e0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2a2f0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2a300 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
2a310 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
2a320 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
2a330 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2a340 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a350 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2a360 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2a370 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2a380 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c   assert( j==nCel
2a390 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  l );.  assert( n
2a3a0 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Old>0 );.  asser
2a3b0 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69  t( nNew>0 );.  i
2a3c0 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20  f( (pageFlags & 
2a3d0 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a  PTF_LEAF)==0 ){.
2a3e0 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d      u8 *zChild =
2a3f0 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d   &apCopy[nOld-1]
2a400 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20  ->aData[8];.    
2a410 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e  memcpy(&apNew[nN
2a420 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ew-1]->aData[8],
2a430 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 20   zChild, 4);.   
2a440 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2a450 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
2a460 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
2a470 65 74 34 62 79 74 65 28 7a 43 68 69 6c 64 29 2c  et4byte(zChild),
2a480 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61   PTRMAP_BTREE, a
2a490 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67  pNew[nNew-1]->pg
2a4a0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2a4b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a4c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
2a4d0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2a4e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2a4f0 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61    if( nxDiv==pPa
2a500 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72  rent->nCell+pPar
2a510 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
2a520 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d  {.    /* Right-m
2a530 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74  ost sibling is t
2a540 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  he right-most ch
2a550 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a  ild of pParent *
2a560 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
2a570 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2a580 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2a590 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  t+8], pgnoNew[nN
2a5a0 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  ew-1]);.  }else{
2a5b0 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
2a5c0 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
2a5d0 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20  e left child of 
2a5e0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2a5f0 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a  in pParent.    *
2a600 2a 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74  * past the right
2a610 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e  -most divider en
2a620 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  try */.    put4b
2a630 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
2a640 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
2a650 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e  Div), pgnoNew[nN
2a660 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ew-1]);.  }..  /
2a670 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20  *.  ** Reparent 
2a680 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20  children of all 
2a690 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  cells..  */.  fo
2a6a0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
2a6b0 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  ++){.    rc = re
2a6c0 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
2a6d0 28 61 70 4e 65 77 5b 69 5d 2c 20 30 29 3b 0a 20  (apNew[i], 0);. 
2a6e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a6f0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
2a700 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
2a710 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74  .  rc = reparent
2a720 43 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65  ChildPages(pPare
2a730 6e 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  nt, 0);.  if( rc
2a740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2a750 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2a760 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42  up;..  /*.  ** B
2a770 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
2a780 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68  t page.  Note th
2a790 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
2a7a0 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68  age (pPage) migh
2a7b0 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  t.  ** have been
2a7c0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
2a7d0 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67  eelist so it mig
2a7e0 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  ht no longer be 
2a7f0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
2a800 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74  * But the parent
2a810 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79   page will alway
2a820 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  s be initialized
2a830 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2a840 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
2a850 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72   );.  sqlite3Scr
2a860 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
2a870 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a  ;.  apCell = 0;.
2a880 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2a890 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20  Parent, 0);.  . 
2a8a0 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70   /*.  ** Cleanup
2a8b0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2a8c0 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f  g..  */.balance_
2a8d0 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74  cleanup:.  sqlit
2a8e0 65 33 50 61 67 65 46 72 65 65 28 61 53 70 61 63  e3PageFree(aSpac
2a8f0 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  e2);.  sqlite3Sc
2a900 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c  ratchFree(apCell
2a910 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2a920 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
2a930 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
2a940 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  d[i]);.  }.  for
2a950 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
2a960 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
2a970 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  age(apNew[i]);. 
2a980 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
2a990 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41  (pParent);.  TRA
2a9a0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
2a9b0 6e 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20  nished with %d: 
2a9c0 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65  old=%d new=%d ce
2a9d0 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lls=%d\n",.     
2a9e0 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
2a9f0 2c 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43  , nOld, nNew, nC
2aa00 65 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell));.  return 
2aa10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2aa20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2aa30 6c 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  led for the root
2aa40 20 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65   page of a btree
2aa50 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a   when the root.*
2aa60 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
2aa70 6e 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20  no cells.  This 
2aa80 69 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  is an opportunit
2aa90 79 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72  y to make the tr
2aaa0 65 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20  ee.** shallower 
2aab0 62 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f  by one level..*/
2aac0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2aad0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65  nce_shallower(Me
2aae0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
2aaf0 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
2ab00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2ab10 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   The only child 
2ab20 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  page of pPage */
2ab30 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
2ab40 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2ab50 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
2ab60 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69  or pChild */.  i
2ab70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ab80 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
2ab90 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2aba0 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
2abb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2abc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2abd0 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42     /* The main B
2abe0 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  Tree structure *
2abf0 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65  /.  int mxCellPe
2ac00 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  rPage;          
2ac10 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2ac20 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20  er of cells per 
2ac30 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2ac40 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2ac50 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
2ac60 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62  lls from pages b
2ac70 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
2ac80 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aca0 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
2acb0 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20   all cells */.. 
2acc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2acd0 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  pParent==0 );.  
2ace0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2acf0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
2ad00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ad10 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2ad20 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2ad30 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2ad40 3b 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  ;.  mxCellPerPag
2ad50 65 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29  e = MX_CELL(pBt)
2ad60 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  ;.  apCell = sql
2ad70 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65  ite3Malloc( mxCe
2ad80 6c 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f  llPerPage*(sizeo
2ad90 66 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31  f(u8*)+sizeof(u1
2ada0 36 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43  6)) );.  if( apC
2adb0 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ell==0 ) return 
2adc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2add0 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
2ade0 61 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72  apCell[mxCellPer
2adf0 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61  Page];.  if( pPa
2ae00 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ae10 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  /* The table is 
2ae20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
2ae30 20 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22   */.    TRACE(("
2ae40 42 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74  BALANCE: empty t
2ae50 61 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67  able %d\n", pPag
2ae60 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
2ae70 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
2ae80 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74  oot page is empt
2ae90 79 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68  y but has one ch
2aea0 69 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74  ild.  Transfer t
2aeb0 68 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d  he.    ** inform
2aec0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20  ation from that 
2aed0 6f 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74  one child into t
2aee0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20  he root page if 
2aef0 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
2af00 66 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63  fit.  This reduc
2af10 65 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20  es the depth of 
2af20 74 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e  the tree by one.
2af30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
2af40 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2af50 69 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61  is page 1, it ha
2af60 73 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61  s less space ava
2af70 69 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20  ilable than.    
2af80 2a 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75  ** its child (du
2af90 65 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74  e to the 100 byt
2afa0 65 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63  e header that oc
2afb0 63 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69  curs at the begi
2afc0 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20  nning.    ** of 
2afd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65  the database fle
2afe0 29 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  ), so it might n
2aff0 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f  ot be able to ho
2b000 6c 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20  ld all of the . 
2b010 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
2b020 6e 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  n currently cont
2b030 61 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69  ained in the chi
2b040 6c 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ld.  If this is 
2b050 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65  the .    ** case
2b060 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f  , then do not do
2b070 20 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20   the transfer.  
2b080 4c 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70  Leave page 1 emp
2b090 74 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  ty except.    **
2b0a0 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70   for the right-p
2b0b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68  ointer to the ch
2b0c0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63  ild page.  The c
2b0d0 68 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65  hild page become
2b0e0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72  s.    ** the vir
2b0f0 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65  tual root of the
2b100 20 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   tree..    */.  
2b110 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65    pgnoChild = ge
2b120 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2b130 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2b140 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61  ffset+8]);.    a
2b150 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
2b160 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
2b170 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67  ( pgnoChild<=pag
2b180 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2b190 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20  e->pBt->pPager) 
2b1a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2b1b0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2b1c0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f  pPage->pBt, pgno
2b1d0 43 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20  Child, &pChild, 
2b1e0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
2b1f0 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f   goto end_shallo
2b200 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69  w_balance;.    i
2b210 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  f( pPage->pgno==
2b220 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  1 ){.      rc = 
2b230 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2b240 50 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61  Page(pChild, pPa
2b250 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2b260 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61  c ) goto end_sha
2b270 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20  llow_balance;.  
2b280 20 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69      assert( pChi
2b290 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ld->nOverflow==0
2b2a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
2b2b0 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30  hild->nFree>=100
2b2c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2b2d0 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61  he child informa
2b2e0 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tion will fit on
2b2f0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20   the root page, 
2b300 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20  so do the.      
2b310 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20    ** copy */.   
2b320 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2b330 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61      zeroPage(pPa
2b340 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ge, pChild->aDat
2b350 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  a[0]);.        f
2b360 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64  or(i=0; i<pChild
2b370 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
2b380 20 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b           apCell[
2b390 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43  i] = findCell(pC
2b3a0 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20  hild,i);.       
2b3b0 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63     szCell[i] = c
2b3c0 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c  ellSizePtr(pChil
2b3d0 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20  d, apCell[i]);. 
2b3e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b3f0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50   assemblePage(pP
2b400 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65  age, pChild->nCe
2b410 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65  ll, apCell, szCe
2b420 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ll);.        /* 
2b430 43 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d 70  Copy the right-p
2b440 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
2b450 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ild to the paren
2b460 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  t. */.        pu
2b470 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2b480 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2b490 66 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20  ffset+8], .     
2b4a0 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
2b4b0 26 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70  &pChild->aData[p
2b4c0 43 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74  Child->hdrOffset
2b4d0 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66  +8]));.        f
2b4e0 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  reePage(pChild);
2b4f0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2b500 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20  "BALANCE: child 
2b510 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70  %d transfer to p
2b520 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64  age 1\n", pChild
2b530 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2b540 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2b550 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20  * The child has 
2b560 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
2b570 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f   that will fit o
2b580 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20  n the root..    
2b590 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20      ** The tree 
2b5a0 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e  is already balan
2b5b0 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67  ced.  Do nothing
2b5c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41  . */.        TRA
2b5d0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
2b5e0 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20  ild %d will not 
2b5f0 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22  fit on page 1\n"
2b600 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
2b610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2b620 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  lse{.      memcp
2b630 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  y(pPage->aData, 
2b640 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70  pChild->aData, p
2b650 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2b660 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
2b670 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
2b680 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50  .      pPage->pP
2b690 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  arent = 0;.     
2b6a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2b6b0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
2b6c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 0);.      asse
2b6d0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2b6e0 4b 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50  K );.      freeP
2b6f0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
2b700 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e     TRACE(("BALAN
2b710 43 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69  CE: transfer chi
2b720 6c 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20  ld %d into root 
2b730 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2b740 20 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e       pChild->pgn
2b750 6f 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  o, pPage->pgno))
2b760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2b770 20 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61   reparentChildPa
2b780 67 65 73 28 70 50 61 67 65 2c 20 31 29 3b 0a 20  ges(pPage, 1);. 
2b790 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b7a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2b7b0 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  ;.    if( ISAUTO
2b7c0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2b7d0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
2b7e0 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
2b7f0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  Cell; i++){ .   
2b800 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2b810 50 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20 69  PutOvfl(pPage, i
2b820 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2b830 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b840 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2b850 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
2b860 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ce;.        }.  
2b870 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2b880 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
2b890 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61  ld);.  }.end_sha
2b8a0 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20  llow_balance:.  
2b8b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43  sqlite3_free(apC
2b8c0 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ell);.  return r
2b8d0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  c;.}.../*.** The
2b8e0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76   root page is ov
2b8f0 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65  erfull.**.** Whe
2b900 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  n this happens, 
2b910 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  Create a new chi
2b920 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79  ld page and copy
2b930 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
2b940 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74   of the root int
2b950 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68  o the child.  Th
2b960 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74  en make the root
2b970 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74  .** page an empt
2b980 79 20 70 61 67 65 20 77 69 74 68 20 72 69 67 68  y page with righ
2b990 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20  tChild pointing 
2b9a0 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68  to the new.** ch
2b9b0 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20  ild.   Finally, 
2b9c0 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74  call balance_int
2b9d0 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e  ernal() on the n
2b9e0 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63  ew child.** to c
2b9f0 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74  ause it to split
2ba00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ba10 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d  balance_deeper(M
2ba20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
2ba30 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2ba40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ba50 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72  value from subpr
2ba60 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65  ocedures */.  Me
2ba70 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20  mPage *pChild;  
2ba80 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2ba90 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
2baa0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
2bab0 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67  hild;     /* Pag
2bac0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2bad0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
2bae0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
2baf0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  t;         /* Th
2bb00 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e BTree */.  int
2bb10 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
2bb20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65   /* Total usable
2bb30 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
2bb40 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2bb50 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
2bb60 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ent of the paren
2bb70 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  t page */.  u8 *
2bb80 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  cdata;          
2bb90 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2bba0 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  e child page */.
2bbb0 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
2bbc0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2bbd0 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 69  to page header i
2bbe0 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e  n parent */.  in
2bbf0 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20  t brk;          
2bc00 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2bc10 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20  ontent of first 
2bc20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a  cell in parent *
2bc30 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
2bc40 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29  ge->pParent==0 )
2bc50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2bc60 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
2bc70 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
2bc80 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
2bc90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2bca0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2bcb0 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  ;.  rc = allocat
2bcc0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2bcd0 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68  &pChild, &pgnoCh
2bce0 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ild, pPage->pgno
2bcf0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2bd00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73   return rc;.  as
2bd10 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2bd20 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43  erIswriteable(pC
2bd30 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29  hild->pDbPage) )
2bd40 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
2bd50 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2bd60 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
2bd70 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
2bd80 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2bd90 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62  t;.  brk = get2b
2bda0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2bdb0 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68  );.  cdata = pCh
2bdc0 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65  ild->aData;.  me
2bdd0 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61 74  mcpy(cdata, &dat
2bde0 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63  a[hdr], pPage->c
2bdf0 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67  ellOffset+2*pPag
2be00 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20  e->nCell-hdr);. 
2be10 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62   memcpy(&cdata[b
2be20 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c  rk], &data[brk],
2be30 20 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29   usableSize-brk)
2be40 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e  ;.  if( pChild->
2be50 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20  isInit ) return 
2be60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
2be70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2be80 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69  reeInitPage(pChi
2be90 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66  ld, pPage);.  if
2bea0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2beb0 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
2bec0 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
2bed0 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f  aOvfl, pPage->aO
2bee0 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  vfl, pPage->nOve
2bef0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61  rflow*sizeof(pPa
2bf00 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ge->aOvfl[0]));.
2bf10 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
2bf20 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76  low = pPage->nOv
2bf30 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43  erflow;.  if( pC
2bf40 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
2bf50 29 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e  ){.    pChild->n
2bf60 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
2bf70 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
2bf80 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43  nCell==pPage->nC
2bf90 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ell );.  zeroPag
2bfa0 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
2bfb0 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
2bfc0 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
2bfd0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2bfe0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2bff0 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
2c000 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
2c010 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
2c020 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50  d into %d\n", pP
2c030 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  age->pgno, pChil
2c040 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28  d->pgno));.  if(
2c050 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2c060 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2c070 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
2c080 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  Bt, pChild->pgno
2c090 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2c0a0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
2c0b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2c0c0 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75  balancedeeper_ou
2c0d0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
2c0e0 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b  i<pChild->nCell;
2c0f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20   i++){.      rc 
2c100 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
2c110 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20  pChild, i);.    
2c120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
2c140 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65  oto balancedeepe
2c150 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
2c160 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65     }.    rc = re
2c170 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73  parentChildPages
2c180 28 70 43 68 69 6c 64 2c 20 31 29 3b 0a 20 20 7d  (pChild, 1);.  }
2c190 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c1a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
2c1b0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
2c1c0 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 62  (pChild);.  }..b
2c1d0 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74  alancedeeper_out
2c1e0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
2c1f0 70 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75 72  pChild);.  retur
2c200 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
2c210 65 63 69 64 65 20 69 66 20 74 68 65 20 70 61 67  ecide if the pag
2c220 65 20 70 50 61 67 65 20 6e 65 65 64 73 20 74 6f  e pPage needs to
2c230 20 62 65 20 62 61 6c 61 6e 63 65 64 2e 20 20 49   be balanced.  I
2c240 66 20 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a  f balancing is.*
2c250 2a 20 72 65 71 75 69 72 65 64 2c 20 63 61 6c 6c  * required, call
2c260 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2c270 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69   balancing routi
2c280 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
2c290 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67  t balance(MemPag
2c2a0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 6e  e *pPage, int in
2c2b0 73 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sert){.  int rc 
2c2c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
2c2d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2c2e0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2c2f0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2c300 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61    if( pPage->pPa
2c310 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rent==0 ){.    r
2c320 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2c330 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2c340 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2c350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2c360 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2c370 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
2c380 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
2c390 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
2c3a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c3b0 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43  _OK && pPage->nC
2c3c0 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ell==0 ){.      
2c3d0 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61  rc = balance_sha
2c3e0 6c 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a 20  llower(pPage);. 
2c3f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2c400 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
2c410 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20  erflow>0 || .   
2c420 20 20 20 20 20 28 21 69 6e 73 65 72 74 20 26 26       (!insert &&
2c430 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50   pPage->nFree>pP
2c440 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2c450 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20  Size*2/3) ){.   
2c460 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2c470 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a  nonroot(pPage);.
2c480 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2c490 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c4a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
2c4b0 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  cks all cursors 
2c4c0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61  that point to ta
2c4d0 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  ble pgnoRoot..**
2c4e0 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65   If any of those
2c4f0 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f 70   cursors were op
2c500 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67  ened with wrFlag
2c510 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72 65  ==0 in a differe
2c520 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  nt.** database c
2c530 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61 74  onnection (a dat
2c540 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2c550 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68 65   that shares the
2c560 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65 20   pager.** cache 
2c570 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
2c580 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64   connection) and
2c590 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e   that other conn
2c5a0 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f  ection .** is no
2c5b0 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e 63  t in the ReadUnc
2c5c0 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65 2c  ommmitted state,
2c5d0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2c5e0 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  ne returns .** S
2c5f0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a  QLITE_LOCKED..**
2c600 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20 63  .** As well as c
2c610 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c  ursors with wrFl
2c620 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20 77  ag==0, cursors w
2c630 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 20 61 6e  ith wrFlag==1 an
2c640 64 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f 62  d .** isIncrblob
2c650 48 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61 6c  Handle==1 are al
2c660 73 6f 20 63 6f 6e 73 69 64 65 72 65 64 20 27 72  so considered 'r
2c670 65 61 64 27 20 63 75 72 73 6f 72 73 2e 20 49 6e  ead' cursors. In
2c680 63 72 65 6d 65 6e 74 61 6c 20 0a 2a 2a 20 62 6c  cremental .** bl
2c690 6f 62 20 63 75 72 73 6f 72 73 20 61 72 65 20 75  ob cursors are u
2c6a0 73 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61  sed for both rea
2c6b0 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
2c6c0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e  ..**.** When pgn
2c6d0 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f  oRoot is the roo
2c6e0 74 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e 74  t page of an int
2c6f0 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73 20  key table, this 
2c700 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f  function is also
2c710 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20  .** responsible 
2c720 66 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  for invalidating
2c730 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2c740 62 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20 74  b cursors when t
2c750 68 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20  he table row.** 
2c760 6f 6e 20 77 68 69 63 68 20 74 68 65 79 20 61 72  on which they ar
2c770 65 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c 65  e opened is dele
2c780 74 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e  ted or modified.
2c790 20 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76   Cursors are inv
2c7a0 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f  alidated.** acco
2c7b0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c  rding to the fol
2c7c0 6c 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a  lowing rules:.**
2c7d0 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42 74  .**   1) When Bt
2c7e0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 20  reeClearTable() 
2c7f0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d  is called to com
2c800 70 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20 74  pletely delete t
2c810 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20  he contents.**  
2c820 20 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65 20      of a B-Tree 
2c830 74 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65 20  table, pExclude 
2c840 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61  is set to zero a
2c850 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f  nd parameter iRo
2c860 77 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73 65  w is .**      se
2c870 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  t to non-zero. I
2c880 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
2c890 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2c8a0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a   cursors open.**
2c8b0 20 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61 62        on the tab
2c8c0 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67 6e  le rooted at pgn
2c8d0 6f 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c 69  oRoot are invali
2c8e0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  dated..**.**   2
2c8f0 29 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73 65  ) When BtreeInse
2c900 72 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65 74  rt(), BtreeDelet
2c910 65 28 29 20 6f 72 20 42 74 72 65 65 50 75 74 44  e() or BtreePutD
2c920 61 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ata() is called 
2c930 74 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69  to .**      modi
2c940 66 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20 76  fy a table row v
2c950 69 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  ia an SQL statem
2c960 65 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69 73  ent, pExclude is
2c970 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20   set to the .** 
2c980 20 20 20 20 20 77 72 69 74 65 20 63 75 72 73 6f       write curso
2c990 72 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65  r used to do the
2c9a0 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61 6e   modification an
2c9b0 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77  d parameter iRow
2c9c0 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20 20   is set.**      
2c9d0 74 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  to the integer r
2c9e0 6f 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d 54  ow id of the B-T
2c9f0 72 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20  ree entry being 
2ca00 6d 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  modified. Unless
2ca10 0a 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75 64  .**      pExclud
2ca20 65 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20 69  e is itself an i
2ca30 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2ca40 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c  cursor, then all
2ca50 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20   incremental.** 
2ca60 20 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f 72       blob cursor
2ca70 73 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52  s open on row iR
2ca80 6f 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65  ow of the B-Tree
2ca90 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
2caa0 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20  ..**.**   3) If 
2cab0 62 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61 6e  both pExclude an
2cac0 64 20 69 52 6f 77 20 61 72 65 20 73 65 74 20 74  d iRow are set t
2cad0 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65  o zero, no incre
2cae0 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20  mental blob .** 
2caf0 20 20 20 20 20 63 75 72 73 6f 72 73 20 61 72 65       cursors are
2cb00 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
2cb10 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
2cb20 6b 52 65 61 64 4c 6f 63 6b 73 28 0a 20 20 42 74  kReadLocks(.  Bt
2cb30 72 65 65 20 2a 70 42 74 72 65 65 2c 20 0a 20 20  ree *pBtree, .  
2cb40 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 0a  Pgno pgnoRoot, .
2cb50 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63    BtCursor *pExc
2cb60 6c 75 64 65 2c 0a 20 20 69 36 34 20 69 52 6f 77  lude,.  i64 iRow
2cb70 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
2cb80 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
2cb90 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
2cba0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2cbb0 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  = pBtree->db;.  
2cbc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2cbd0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2cbe0 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28  Btree) );.  for(
2cbf0 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
2cc00 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
2cc10 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c      if( p==pExcl
2cc20 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ude ) continue;.
2cc30 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
2cc40 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20  oot!=pgnoRoot ) 
2cc50 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65  continue;.#ifnde
2cc60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
2cc70 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20 70  CRBLOB.    if( p
2cc80 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
2cc90 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20 20 20  le && ( .       
2cca0 20 20 28 21 70 45 78 63 6c 75 64 65 20 26 26 20    (!pExclude && 
2ccb0 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20 28  iRow).      || (
2ccc0 70 45 78 63 6c 75 64 65 20 26 26 20 21 70 45 78  pExclude && !pEx
2ccd0 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f  clude->isIncrblo
2cce0 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e  bHandle && p->in
2ccf0 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20  fo.nKey==iRow). 
2cd00 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e     )){.      p->
2cd10 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2cd20 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23  INVALID;.    }.#
2cd30 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d  endif.    if( p-
2cd40 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2cd50 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65  VALID ) continue
2cd60 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46  ;.    if( p->wrF
2cd70 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20  lag==0 .#ifndef 
2cd80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
2cd90 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e  BLOB.     || p->
2cda0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2cdb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20  .#endif.    ){. 
2cdc0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2cdd0 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65  Other = p->pBtre
2cde0 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 69 66 28  e->db;.      if(
2cdf0 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20   dbOther==0 ||. 
2ce00 20 20 20 20 20 20 20 20 28 64 62 4f 74 68 65 72          (dbOther
2ce10 21 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72  !=db && (dbOther
2ce20 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2ce30 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2ce40 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  )==0) ){.       
2ce50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2ce60 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  OCKED;.      }. 
2ce70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2ce80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ce90 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2cea0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
2ceb0 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b  he BTree.  The k
2cec0 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ey is given by (
2ced0 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e  pKey,nKey).** an
2cee0 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69  d the data is gi
2cef0 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44  ven by (pData,nD
2cf00 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f  ata).  The curso
2cf10 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  r is used only t
2cf20 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74  o.** define what
2cf30 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72   table the recor
2cf40 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  d should be inse
2cf50 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20  rted into.  The 
2cf60 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
2cf70 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2cf80 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
2cf90 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e  .**.** For an IN
2cfa0 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79  TKEY table, only
2cfb0 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20   the nKey value 
2cfc0 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73  of the key is us
2cfd0 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20  ed.  pKey is.** 
2cfe0 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20  ignored.  For a 
2cff0 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20  ZERODATA table, 
2d000 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44  the pData and nD
2d010 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e  ata are both ign
2d020 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
2d030 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
2d040 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2d050 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2d060 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
2d070 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20   into the table 
2d080 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  of this cursor *
2d090 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2d0a0 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
2d0b0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66     /* The key of
2d0c0 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
2d0d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2d0e0 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
2d0f0 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  a,  /* The data 
2d100 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
2d110 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  d */.  int nZero
2d120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d130 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d140 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73  of extra 0 bytes
2d150 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61   to append to da
2d160 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65  ta */.  int appe
2d170 6e 64 42 69 61 73 20 20 20 20 20 20 20 20 20 20  ndBias          
2d180 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d190 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79  f this is likely
2d1a0 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b   an append */.){
2d1b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2d1c0 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65   loc;.  int szNe
2d1d0 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w;.  MemPage *pP
2d1e0 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  age;.  Btree *p 
2d1f0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
2d200 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2d210 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
2d220 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65  gned char *oldCe
2d230 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ll;.  unsigned c
2d240 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30  har *newCell = 0
2d250 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2d260 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2d270 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ur) );.  if( pBt
2d280 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2d290 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2d2a0 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2d2b0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2d2c0 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20  before doing an 
2d2d0 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 63  insert */.    rc
2d2e0 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2d2f0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2d300 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2d310 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2d320 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2d330 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2d340 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77  ;.  if( !pCur->w
2d350 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rFlag ){.    ret
2d360 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2d370 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74     /* Cursor not
2d380 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e   open for writin
2d390 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63  g */.  }.  if( c
2d3a0 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43  heckReadLocks(pC
2d3b0 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72  ur->pBtree, pCur
2d3c0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2d3d0 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72  , nKey) ){.    r
2d3e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2d3f0 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c  KED; /* The tabl
2d400 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
2d410 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
2d420 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
2d430 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d440 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
2d450 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2d460 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76  p;.  }..  /* Sav
2d470 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
2d480 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
2d490 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69  sors open on thi
2d4a0 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c 65  s table */.  cle
2d4b0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
2d4c0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a 20  (pCur);.  if( . 
2d4d0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
2d4e0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
2d4f0 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
2d500 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c  noRoot, pCur)) |
2d510 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  |.    SQLITE_OK!
2d520 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  =(rc = sqlite3Bt
2d530 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
2d540 70 4b 65 79 2c 20 30 2c 20 6e 4b 65 79 2c 20 61  pKey, 0, nKey, a
2d550 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29  ppendBias, &loc)
2d560 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
2d570 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  n rc;.  }..  pPa
2d580 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2d590 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2d5a0 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65  e->intKey || nKe
2d5b0 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
2d5c0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c  ( pPage->leaf ||
2d5d0 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
2d5e0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53  );.  TRACE(("INS
2d5f0 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b  ERT: table=%d nk
2d600 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64  ey=%lld ndata=%d
2d610 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a   page=%d %s\n",.
2d620 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2d630 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
2d640 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67  nData, pPage->pg
2d650 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f  no,.          lo
2d660 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74  c==0 ? "overwrit
2d670 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22  e" : "new entry"
2d680 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
2d690 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2d6a0 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
2d6b0 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65  ce(pBt);.  newCe
2d6c0 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
2d6d0 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65  ace;.  if( newCe
2d6e0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
2d6f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72  QLITE_NOMEM;.  r
2d700 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70  c = fillInCell(p
2d710 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70  Page, newCell, p
2d720 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61  Key, nKey, pData
2d730 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20  , nData, nZero, 
2d740 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72  &szNew);.  if( r
2d750 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73  c ) goto end_ins
2d760 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ert;.  assert( s
2d770 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  zNew==cellSizePt
2d780 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c  r(pPage, newCell
2d790 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2d7a0 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49  zNew<=MX_CELL_SI
2d7b0 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28  ZE(pBt) );.  if(
2d7c0 20 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f   loc==0 && CURSO
2d7d0 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
2d7e0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36  State ){.    u16
2d7f0 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65   szOld;.    asse
2d800 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
2d810 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
2d820 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2d830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d840 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2d850 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2d860 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  ( rc ){.      go
2d870 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2d880 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c     }.    oldCell
2d890 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2d8a0 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20  e, pCur->idx);. 
2d8b0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2d8c0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  eaf ){.      mem
2d8d0 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64  cpy(newCell, old
2d8e0 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a  Cell, 4);.    }.
2d8f0 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c      szOld = cell
2d900 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f  SizePtr(pPage, o
2d910 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20  ldCell);.    rc 
2d920 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
2d930 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
2d940 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2d950 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64  nd_insert;.    d
2d960 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2d970 43 75 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29  Cur->idx, szOld)
2d980 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f  ;.  }else if( lo
2d990 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43  c<0 && pPage->nC
2d9a0 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73  ell>0 ){.    ass
2d9b0 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
2d9c0 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64   );.    pCur->id
2d9d0 78 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  x++;.    pCur->i
2d9e0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2d9f0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
2da00 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 0;.  }else{
2da10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2da20 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a  ge->leaf );.  }.
2da30 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
2da40 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2da50 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e  dx, newCell, szN
2da60 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  ew, 0, 0);.  if(
2da70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2da80 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
2da90 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  ;.  rc = balance
2daa0 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 69 66  (pPage, 1);.  if
2dab0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dac0 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
2dad0 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64  t(pCur);.  }.end
2dae0 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72  _insert:.  retur
2daf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
2db00 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
2db10 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
2db20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
2db30 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
2db40 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2db50 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
2db60 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
2db70 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
2db80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2db90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2dba0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2dbb0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2dbc0 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72   *pCell;.  int r
2dbd0 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  c;.  Pgno pgnoCh
2dbe0 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65  ild = 0;.  Btree
2dbf0 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
2dc00 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
2dc10 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
2dc20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2dc30 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2dc40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2dc50 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2dc60 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
2dc70 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
2dc80 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
2dc90 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
2dca0 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f  action before do
2dcb0 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a  ing a delete */.
2dcc0 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2dcd0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2dce0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2dcf0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2dd00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2dd10 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2dd20 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43  Only );.  if( pC
2dd30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2dd40 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
2dd50 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2dd60 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  p;.  }.  if( pCu
2dd70 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67 65 2d  r->idx >= pPage-
2dd80 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65  >nCell ){.    re
2dd90 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2dda0 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  R;  /* The curso
2ddb0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2ddc0 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f  g to anything */
2ddd0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72  .  }.  if( !pCur
2dde0 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
2ddf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2de00 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74  RM;   /* Did not
2de10 20 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f   open this curso
2de20 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f  r for writing */
2de30 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b  .  }.  if( check
2de40 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e  ReadLocks(pCur->
2de50 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67  pBtree, pCur->pg
2de60 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43  noRoot, pCur, pC
2de70 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 20 29  ur->info.nKey) )
2de80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2de90 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
2dea0 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
2deb0 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
2dec0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a  ad lock */.  }..
2ded0 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
2dee0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2def0 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f  position (a no-o
2df00 70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  p if the cursor 
2df10 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20  is not in .  ** 
2df20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2df30 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73 61  EK state) and sa
2df40 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2df50 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2df60 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e  rsors .  ** open
2df70 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
2df80 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71  le. Then call sq
2df90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2dfa0 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  ) on the page.  
2dfb0 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ** that the entr
2dfc0 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  y will be delete
2dfd0 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69  d from..  */.  i
2dfe0 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65  f( .    (rc = re
2dff0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2e000 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c  ion(pCur))!=0 ||
2e010 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41  .    (rc = saveA
2e020 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2e030 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2e040 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2e050 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
2e060 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2e070 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b  DbPage))!=0.  ){
2e080 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2e090 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
2e0a0 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
2e0b0 20 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65   its page and le
2e0c0 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69  ave pCell pointi
2e0d0 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64  ng to the.  ** d
2e0e0 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65  ata. The clearCe
2e0f0 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20  ll() call frees 
2e100 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2e110 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2e120 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  th the.  ** cell
2e130 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  . The cell itsel
2e140 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63  f is still intac
2e150 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20  t..  */.  pCell 
2e160 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2e170 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
2e180 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2e190 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c   ){.    pgnoChil
2e1a0 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  d = get4byte(pCe
2e1b0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ll);.  }.  rc = 
2e1c0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
2e1d0 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72   pCell);.  if( r
2e1e0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2e1f0 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  rc;.  }..  if( !
2e200 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e210 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
2e220 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62   entry we are ab
2e230 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73  out to delete is
2e240 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69   not a leaf so i
2e250 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20  f we do not.    
2e260 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ** do something 
2e270 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20  we will leave a 
2e280 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72  hole on an inter
2e290 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
2e2a0 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c   We have to fill
2e2b0 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76   the hole by mov
2e2c0 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72  ing in a cell fr
2e2d0 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a  om a leaf.  The.
2e2e0 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c      ** next Cell
2e2f0 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74   after the one t
2e300 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20  o be deleted is 
2e310 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
2e320 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74  ist and.    ** t
2e330 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77  o be a leaf so w
2e340 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20  e can use it..  
2e350 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f    */.    BtCurso
2e360 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75  r leafCur;.    u
2e370 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
2e380 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74  ext;.    int not
2e390 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Used;.    unsign
2e3a0 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c  ed char *tempCel
2e3b0 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
2e3c0 74 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  t( !pPage->intKe
2e3d0 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
2e3e0 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
2e3f0 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75  or(pCur, &leafCu
2e400 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
2e410 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
2e420 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
2e430 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2e440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2e460 67 65 72 57 72 69 74 65 28 6c 65 61 66 43 75 72  gerWrite(leafCur
2e470 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  .pPage->pDbPage)
2e480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e490 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e4a0 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78  .      u16 szNex
2e4b0 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  t;.      TRACE((
2e4c0 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25  "DELETE: table=%
2e4d0 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61  d delete interna
2e4e0 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63  l from %d replac
2e4f0 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e  e from leaf %d\n
2e500 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72  ",.         pCur
2e510 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
2e520 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72  e->pgno, leafCur
2e530 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a  .pPage->pgno));.
2e540 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
2e550 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2e560 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
2e570 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20  ge, pCell));.   
2e580 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43     pNext = findC
2e590 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67  ell(leafCur.pPag
2e5a0 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b  e, leafCur.idx);
2e5b0 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20  .      szNext = 
2e5c0 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66  cellSizePtr(leaf
2e5d0 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74  Cur.pPage, pNext
2e5e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2e5f0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
2e600 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a  t)>=szNext+4 );.
2e610 20 20 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65        allocateTe
2e620 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
2e630 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70      tempCell = p
2e640 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  Bt->pTmpSpace;. 
2e650 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c       if( tempCel
2e660 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
2e670 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2e680 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
2e690 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e6a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2e6b0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2e6c0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2e6d0 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b  pNext-4, szNext+
2e6e0 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b  4, tempCell, 0);
2e6f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e710 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
2e720 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
2e730 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  wCell(pPage, pCu
2e740 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69  r->idx), pgnoChi
2e750 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ld);.        rc 
2e760 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2e770 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2e780 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e7a0 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72  dropCell(leafCur
2e7b0 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e  .pPage, leafCur.
2e7c0 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20  idx, szNext);.  
2e7d0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2e7e0 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ce(leafCur.pPage
2e7f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2e800 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
2e810 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43  treeReleaseTempC
2e820 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b  ursor(&leafCur);
2e830 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52  .  }else{.    TR
2e840 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61  ACE(("DELETE: ta
2e850 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72  ble=%d delete fr
2e860 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20  om leaf %d\n",. 
2e870 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2e880 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Root, pPage->pgn
2e890 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c  o));.    dropCel
2e8a0 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2e8b0 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
2e8c0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
2e8d0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2e8e0 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a  (pPage, 0);.  }.
2e8f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e900 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
2e910 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
2e920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e930 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2e940 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
2e950 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2e960 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
2e970 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
2e980 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
2e990 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
2e9a0 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
2e9b0 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
2e9c0 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
2e9d0 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
2e9e0 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
2e9f0 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
2ea00 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
2ea10 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
2ea20 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
2ea30 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
2ea40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
2ea50 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
2ea60 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
2ea70 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
2ea80 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
2ea90 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
2eaa0 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
2eab0 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
2eac0 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73  SQL indices.*/.s
2ead0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
2eae0 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
2eaf0 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
2eb00 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
2eb10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2eb20 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
2eb30 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
2eb40 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
2eb50 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
2eb60 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2eb70 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2eb80 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
2eb90 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
2eba0 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
2ebb0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
2ebc0 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a  action first */.
2ebd0 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2ebe0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2ebf0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2ec00 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2ec10 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2ec20 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2ec30 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20  Only );..#ifdef 
2ec40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2ec50 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c  VACUUM.  rc = al
2ec60 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2ec70 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
2ec80 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
2ec90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2eca0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2ecb0 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  lse.  if( pBt->a
2ecc0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2ecd0 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20   Pgno pgnoMove; 
2ece0 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70       /* Move a p
2ecf0 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65  age here to make
2ed00 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f   room for the ro
2ed10 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d  ot-page */.    M
2ed20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76  emPage *pPageMov
2ed30 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74  e; /* The page t
2ed40 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20  o move to. */.. 
2ed50 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61     /* Creating a
2ed60 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70   new table may p
2ed70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20  robably require 
2ed80 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69  moving an existi
2ed90 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  ng database.    
2eda0 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20  ** to make room 
2edb0 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
2edc0 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e  es root page. In
2edd0 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20   case this page 
2ede0 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74  turns.    ** out
2edf0 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c   to be an overfl
2ee00 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20  ow page, delete 
2ee10 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  all overflow pag
2ee20 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20  e-map caches.   
2ee30 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e   ** held by open
2ee40 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f   cursors..    */
2ee50 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
2ee60 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
2ee70 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  pBt);..    /* Re
2ee80 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ad the value of 
2ee90 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65  meta[3] from the
2eea0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74   database to det
2eeb0 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65  ermine where the
2eec0 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  .    ** root pag
2eed0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
2eee0 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65  le should go. me
2eef0 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72  ta[3] is the lar
2ef00 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2ef10 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f     ** created so
2ef20 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77   far, so the new
2ef30 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d   root-page is (m
2ef40 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a  eta[3]+1)..    *
2ef50 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2ef60 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
2ef70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b  , 4, &pgnoRoot);
2ef80 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2ef90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2efa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2efb0 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b  .    pgnoRoot++;
2efc0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  ..    /* The new
2efd0 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e   root-page may n
2efe0 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ot be allocated 
2eff0 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  on a pointer-map
2f000 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20   page, or the.  
2f010 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
2f020 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  E page..    */. 
2f030 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f     while( pgnoRo
2f040 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e  ot==PTRMAP_PAGEN
2f050 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29  O(pBt, pgnoRoot)
2f060 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f   ||.        pgno
2f070 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Root==PENDING_BY
2f080 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
2f090 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b        pgnoRoot++
2f0a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2f0b0 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20  rt( pgnoRoot>=3 
2f0c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  );..    /* Alloc
2f0d0 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20  ate a page. The 
2f0e0 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e  page that curren
2f0f0 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70  tly resides at p
2f100 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20  gnoRoot will.   
2f110 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20   ** be moved to 
2f120 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
2f130 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61  ge (unless the a
2f140 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61  llocated page ha
2f150 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20  ppens.    ** to 
2f160 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f  reside at pgnoRo
2f170 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ot)..    */.    
2f180 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2f190 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61  eePage(pBt, &pPa
2f1a0 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76  geMove, &pgnoMov
2f1b0 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  e, pgnoRoot, 1);
2f1c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2f1d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f1e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2f1f0 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f  ..    if( pgnoMo
2f200 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ve!=pgnoRoot ){.
2f210 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f        /* pgnoRoo
2f220 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
2f230 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  at will be used 
2f240 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  for the root-pag
2f250 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68  e of.      ** th
2f260 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73  e new table (ass
2f270 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64  uming an error d
2f280 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42  id not occur). B
2f290 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20  ut we were.     
2f2a0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67   ** allocated pg
2f2b0 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69  noMove. If requi
2f2c0 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20  red (i.e. if it 
2f2d0 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  was not allocate
2f2e0 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78  d.      ** by ex
2f2f0 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65  tending the file
2f300 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ), the current p
2f310 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20  age at position 
2f320 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a  pgnoMove.      *
2f330 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75  * is already jou
2f340 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  rnaled..      */
2f350 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
2f360 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72  .      Pgno iPtr
2f370 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c  Page;..      rel
2f380 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f  easePage(pPageMo
2f390 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d  ve);..      /* M
2f3a0 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72  ove the page cur
2f3b0 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f  rently at pgnoRo
2f3c0 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20  ot to pgnoMove. 
2f3d0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2f3e0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2f3f0 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2f400 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2f410 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f430 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2f440 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74   }.      rc = pt
2f450 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e  rmapGet(pBt, pgn
2f460 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26  oRoot, &eType, &
2f470 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  iPtrPage);.     
2f480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f490 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  OK || eType==PTR
2f4a0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20  MAP_ROOTPAGE || 
2f4b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2f4c0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2f4d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2f4e0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2f4f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2f500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2f510 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
2f520 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
2f530 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2f540 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
2f550 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2f560 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
2f570 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
2f580 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2f590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f5a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2f5b0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
2f5c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2f5d0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
2f5e0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
2f5f0 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
2f600 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20  Page, pgnoMove, 
2f610 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  0);.      releas
2f620 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20  ePage(pRoot);.. 
2f630 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74       /* Obtain t
2f640 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52  he page at pgnoR
2f650 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  oot */.      if(
2f660 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f670 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2f680 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2f690 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2f6a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
2f6b0 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
2f6c0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
2f6d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f6e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2f6f0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2f700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f710 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
2f720 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2f730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2f750 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
2f760 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2f770 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2f780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
2f790 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b  oot = pPageMove;
2f7a0 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20  .    } ..    /* 
2f7b0 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  Update the point
2f7c0 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d  er-map and meta-
2f7d0 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65  data with the ne
2f7e0 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  w root-page numb
2f7f0 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  er. */.    rc = 
2f800 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2f810 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f  gnoRoot, PTRMAP_
2f820 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20  ROOTPAGE, 0);.  
2f830 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f840 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2f850 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
2f860 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2f870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2f880 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
2f890 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  4, pgnoRoot);.  
2f8a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f8b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
2f8c0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
2f8d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2f8e0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2f8f0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2f900 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
2f910 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
2f920 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2f930 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
2f940 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71  dif.  assert( sq
2f950 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2f960 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
2f970 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Page) );.  zeroP
2f980 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
2f990 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
2f9a0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2f9b0 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  f(pRoot->pDbPage
2f9c0 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20  );.  *piTable = 
2f9d0 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20  (int)pgnoRoot;. 
2f9e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f9f0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
2fa00 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
2fa10 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
2fa20 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
2fa30 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
2fa40 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2fa50 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
2fa60 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
2fa70 63 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54  c = btreeCreateT
2fa80 61 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c  able(p, piTable,
2fa90 20 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74   flags);.  sqlit
2faa0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
2fab0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2fac0 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65  ./*.** Erase the
2fad0 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
2fae0 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73  page and all its
2faf0 20 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75   children.  Retu
2fb00 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74  rn.** the page t
2fb10 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
2fb20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
2fb30 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2fb40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2fb50 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2fb60 68 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f  he BTree that co
2fb70 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65  ntains the table
2fb80 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2fba0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c  age number to cl
2fbb0 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ear */.  MemPage
2fbc0 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f   *pParent,     /
2fbd0 2a 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20  * Parent page.  
2fbe0 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f  NULL for the roo
2fbf0 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50  t */.  int freeP
2fc00 61 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20  ageFlag      /* 
2fc10 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20  Deallocate page 
2fc20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
2fc30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2fc40 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
2fc50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2fc60 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Cell;.  int i;..
2fc70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2fc80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
2fc90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
2fca0 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65  ( pgno>pagerPage
2fcb0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
2fcc0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
2fcd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2fce0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  BKPT;.  }..  rc 
2fcf0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2fd00 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61  (pBt, pgno, &pPa
2fd10 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
2fd20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
2fd30 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
2fd40 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
2fd50 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
2fd60 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
2fd70 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2fd80 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
2fd90 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2fda0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
2fdb0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
2fdc0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
2fdd0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c   pPage->pParent,
2fde0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
2fdf0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2fe00 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2fe10 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
2fe20 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2fe30 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
2fe40 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2fe50 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2fe60 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
2fe70 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2fe80 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
2fe90 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
2fea0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2feb0 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50  a[8]), pPage->pP
2fec0 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69  arent, 1);.    i
2fed0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
2fee0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2fef0 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  ut;.  }.  if( fr
2ff00 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20  eePageFlag ){.  
2ff10 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2ff20 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20  pPage);.  }else 
2ff30 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
2ff40 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2ff50 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20  e->pDbPage))==0 
2ff60 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  ){.    zeroPage(
2ff70 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44  pPage, pPage->aD
2ff80 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41  ata[0] | PTF_LEA
2ff90 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61  F);.  }..clearda
2ffa0 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a  tabasepage_out:.
2ffb0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2ffc0 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
2ffd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
2ffe0 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  te all informati
2fff0 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  on from a single
30000 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
30010 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20  tabase.  iTable 
30020 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  is.** the page n
30030 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  umber of the roo
30040 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
30050 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
30060 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20  ine returns,.** 
30070 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
30080 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c   empty, but stil
30090 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  l exists..**.** 
300a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
300b0 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
300c0 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
300d0 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
300e0 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ** read cursors 
300f0 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f  on the table.  O
30100 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72  pen write cursor
30110 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
30120 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68  he.** root of th
30130 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  e table..*/.int 
30140 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
30150 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  rTable(Btree *p,
30160 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
30170 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
30180 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
30190 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
301a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
301b0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
301c0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
301d0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
301e0 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
301f0 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
30200 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
30210 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69  ERROR;.  }else i
30220 66 28 20 28 72 63 20 3d 20 63 68 65 63 6b 52 65  f( (rc = checkRe
30230 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
30240 65 2c 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54  e, 0, 1))!=SQLIT
30250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e  E_OK ){.    /* n
30260 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a  othing to do */.
30270 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49    }else if( SQLI
30280 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
30290 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
302a0 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a   iTable, 0)) ){.
302b0 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74      /* nothing t
302c0 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  o do */.  }else{
302d0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
302e0 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
302f0 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30   (Pgno)iTable, 0
30300 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
30310 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
30320 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
30330 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c  ../*.** Erase al
30340 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  l information in
30350 20 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64   a table and add
30360 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
30370 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65   table to.** the
30380 20 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65   freelist.  Exce
30390 70 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  pt, the root of 
303a0 74 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61  the principle ta
303b0 62 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a  ble (the one on.
303c0 2a 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65  ** page 1) is ne
303d0 76 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65  ver added to the
303e0 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
303f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
30400 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c  ll fail with SQL
30410 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68  ITE_LOCKED if th
30420 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e  ere are any open
30430 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  .** cursors on t
30440 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
30450 49 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73  If AUTOVACUUM is
30460 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65   enabled and the
30470 20 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20   page at iTable 
30480 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a  is not the last.
30490 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20  ** root page in 
304a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
304b0 65 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  e, then the last
304c0 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69   root page .** i
304d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
304e0 69 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74  ile is moved int
304f0 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65  o the slot forme
30500 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a  rly occupied by.
30510 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68  ** iTable and th
30520 61 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72  at last slot for
30530 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62  merly occupied b
30540 79 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  y the last root 
30550 70 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64  page.** is added
30560 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
30570 20 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62   instead of iTab
30580 6c 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79  le.  In this say
30590 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61  , all.** root pa
305a0 67 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20  ges are kept at 
305b0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
305c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
305d0 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  le, which.** is 
305e0 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55  necessary for AU
305f0 54 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b  TOVACUUM to work
30600 20 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65   right.  *piMove
30610 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  d is set to the 
30620 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
30630 74 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20  that used to be 
30640 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
30650 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62  ge in the file b
30660 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76  efore.** the mov
30670 65 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67  e.  If no page g
30680 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f  ets moved, *piMo
30690 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ved is set to 0.
306a0 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f  .** The last roo
306b0 74 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64  t page is record
306c0 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e  ed in meta[3] an
306d0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
306e0 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64  * meta[3] is upd
306f0 61 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f  ated by this pro
30700 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  cedure..*/.stati
30710 63 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54  c int btreeDropT
30720 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
30730 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
30740 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  piMoved){.  int 
30750 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
30760 50 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68  Page = 0;.  BtSh
30770 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
30780 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Bt;..  assert( s
30790 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
307a0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66  Mutex(p) );.  if
307b0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
307c0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
307d0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61   return pBt->rea
307e0 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
307f0 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
30800 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
30810 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
30820 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20  to drop a table 
30830 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61  if any cursors a
30840 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20  re open on the. 
30850 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
30860 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
30870 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
30880 65 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61  e the backend ma
30890 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d  y.  ** need to m
308a0 6f 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74  ove another root
308b0 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20  -page to fill a 
308c0 67 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20  gap left by the 
308d0 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f  deleted.  ** roo
308e0 74 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70  t page. If an op
308f0 65 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73  en cursor was us
30900 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20  ing this page a 
30910 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20  problem would . 
30920 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a   ** occur..  */.
30930 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
30940 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
30950 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
30960 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
30970 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
30980 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c  pBt, (Pgno)iTabl
30990 65 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  e, &pPage, 0);. 
309a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
309b0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
309c0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
309d0 6c 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20  le(p, iTable);. 
309e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
309f0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
30a00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
30a10 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65  ;.  }..  *piMove
30a20 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54  d = 0;..  if( iT
30a30 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66  able>1 ){.#ifdef
30a40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30a50 4f 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d  OVACUUM.    rc =
30a60 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
30a70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
30a80 65 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a  e(pPage);.#else.
30a90 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
30aa0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
30ab0 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e   Pgno maxRootPgn
30ac0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
30ad0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
30ae0 61 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74  a(p, 4, &maxRoot
30af0 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Pgno);.      if(
30b00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30b10 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
30b20 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30b30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
30b40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
30b50 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52  if( iTable==maxR
30b60 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  ootPgno ){.     
30b70 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62     /* If the tab
30b80 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
30b90 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69   is the table wi
30ba0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  th the largest r
30bb0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
30bc0 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
30bd0 65 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20  e database, put 
30be0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e  the root page on
30bf0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20   the free list. 
30c00 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
30c10 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
30c20 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
30c30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
30c40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
30c50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30c60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
30c70 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
30c80 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
30c90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
30ca0 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
30cb0 64 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  d does not have 
30cc0 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
30cd0 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
30ce0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
30cf0 61 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65  atabase. So move
30d00 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64   the page that d
30d10 6f 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  oes into the .  
30d20 20 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66        ** gap lef
30d30 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64  t by the deleted
30d40 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20   root-page..    
30d50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d      */.        M
30d60 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20  emPage *pMove;. 
30d70 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
30d80 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
30d90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
30da0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
30db0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70   maxRootPgno, &p
30dc0 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Move, 0);.      
30dd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
30df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30e00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
30e10 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
30e20 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d  pBt, pMove, PTRM
30e30 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20  AP_ROOTPAGE, 0, 
30e40 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
30e50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30e60 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
30e70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30e80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
30e90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
30ea0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
30eb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
30ec0 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
30ed0 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
30ee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
30ef0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30f00 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
30f10 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
30f20 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
30f30 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
30f40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30f50 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
30f60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30f70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30f80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69     }.        *pi
30fa0 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50  Moved = maxRootP
30fb0 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
30fc0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e      /* Set the n
30fd0 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67  ew 'max-root-pag
30fe0 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  e' value in the 
30ff0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e  database header.
31000 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
31010 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  s the old value 
31020 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f  less one, less o
31030 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20  ne more if that 
31040 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20  happens to.     
31050 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61   ** be a root-pa
31060 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ge number, less 
31070 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61  one again if tha
31080 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  t is the.      *
31090 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  * PENDING_BYTE_P
310a0 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  AGE..      */.  
310b0 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
310c0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78  -;.      if( max
310d0 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  RootPgno==PENDIN
310e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
310f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
31100 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
31110 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78   }.      if( max
31120 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50  RootPgno==PTRMAP
31130 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78  _PAGENO(pBt, max
31140 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20  RootPgno) ){.   
31150 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
31160 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
31170 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f    assert( maxRoo
31180 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  tPgno!=PENDING_B
31190 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
311a0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
311b0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
311c0 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f  eta(p, 4, maxRoo
311d0 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  tPgno);.    }els
311e0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
311f0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
31200 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31210 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  (pPage);.    }.#
31220 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
31230 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33     /* If sqlite3
31240 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77  BtreeDropTable w
31250 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67  as called on pag
31260 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f  e 1. */.    zero
31270 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f  Page(pPage, PTF_
31280 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20  INTKEY|PTF_LEAF 
31290 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
312a0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
312b0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
312c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
312d0 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20  DropTable(Btree 
312e0 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  *p, int iTable, 
312f0 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20  int *piMoved){. 
31300 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
31310 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
31320 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20  .  p->pBt->db = 
31330 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74  p->db;.  rc = bt
31340 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20  reeDropTable(p, 
31350 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29  iTable, piMoved)
31360 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
31370 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
31380 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
31390 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69   Read the meta-i
313a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f  nformation out o
313b0 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
313c0 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69  e.  Meta[0].** i
313d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
313e0 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65  free pages curre
313f0 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntly in the data
31400 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a  base.  Meta[1].*
31410 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31  * through meta[1
31420 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  5] are available
31430 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68   for use by high
31440 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61  er layers.  Meta
31450 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f  [0].** is read-o
31460 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20  nly, the others 
31470 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a  are read/write..
31480 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  ** .** The schem
31490 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20  a layer numbers 
314a0 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66  meta values diff
314b0 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65  erently.  At the
314c0 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72   schema.** layer
314d0 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f   (and the SetCoo
314e0 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b  kie and ReadCook
314f0 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20  ie opcodes) the 
31500 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65  number of.** fre
31510 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76  e pages is not v
31520 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b  isible.  So Cook
31530 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d  ie[0] is the sam
31540 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f  e as Meta[1]..*/
31550 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
31560 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a  eGetMeta(Btree *
31570 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
31580 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67  *pMeta){.  DbPag
31590 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e  e *pDbPage;.  in
315a0 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
315b0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74   char *pP1;.  Bt
315c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
315d0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
315e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
315f0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
31600 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20  ;..  /* Reading 
31610 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75  a meta-data valu
31620 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61  e requires a rea
31630 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31  d-lock on page 1
31640 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a   (and hence.  **
31650 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
31660 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61  er table. We gra
31670 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61  b this lock rega
31680 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
31690 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  r or.  ** not th
316a0 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  e SQLITE_ReadUnc
316b0 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
316c0 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20   set (the table 
316d0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20  rooted at page. 
316e0 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64   ** 1 is treated
316f0 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
31700 73 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65  se by queryTable
31710 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54  Lock() and lockT
31720 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20  able())..  */.  
31730 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c  rc = queryTableL
31740 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c  ock(p, 1, READ_L
31750 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
31760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31770 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
31780 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
31790 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
317a0 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
317b0 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d  dx<=15 );.  rc =
317c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
317d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c  (pBt->pPager, 1,
317e0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
317f0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
31800 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
31810 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
31820 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 28 75 6e  .  }.  pP1 = (un
31830 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71  signed char *)sq
31840 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
31850 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70  a(pDbPage);.  *p
31860 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28  Meta = get4byte(
31870 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
31880 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
31890 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
318a0 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61  ..  /* If autova
318b0 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c  cuumed is disabl
318c0 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
318d0 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69   but we are tryi
318e0 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65  ng to .  ** acce
318f0 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d  ss an autovacuum
31900 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
31910 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62  n make the datab
31920 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20  ase readonly. . 
31930 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
31940 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31950 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26  M.  if( idx==4 &
31960 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74  & *pMeta>0 ) pBt
31970 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
31980 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61  #endif..  /* Gra
31990 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  b the read-lock 
319a0 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
319b0 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
319c0 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
319d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
319e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
319f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
31a00 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d  rite meta-inform
31a10 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20  ation back into 
31a20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
31a30 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61  eta[0] is.** rea
31a40 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e  d-only and may n
31a50 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a  ot be written..*
31a60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
31a70 65 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72  eeUpdateMeta(Btr
31a80 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
31a90 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74  u32 iMeta){.  Bt
31aa0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
31ab0 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
31ac0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e   char *pP1;.  in
31ad0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
31ae0 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31  idx>=1 && idx<=1
31af0 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
31b00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
31b10 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
31b20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
31b30 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
31b40 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
31b50 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
31b60 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
31b70 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
31b80 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
31b90 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b  Bt->pPage1!=0 );
31ba0 0a 20 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  .    pP1 = pBt->
31bb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
31bc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31bd0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
31be0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
31bf0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
31c00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31c10 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  put4byte(&pP1[36
31c20 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61   + idx*4], iMeta
31c30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
31c40 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
31c50 4d 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d  M.      if( idx=
31c60 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =7 ){.        as
31c70 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
31c80 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d  acuum || iMeta==
31c90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
31ca0 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c  ert( iMeta==0 ||
31cb0 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20   iMeta==1 );.   
31cc0 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
31cd0 63 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20  cuum = iMeta;.  
31ce0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31cf0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
31d00 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
31d10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
31d20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
31d30 66 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65  flag byte at the
31d40 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
31d50 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
31d60 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72  cursor.** is cur
31d70 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
31d80 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
31d90 65 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43  e3BtreeFlags(BtC
31da0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
31db0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62  /* TODO: What ab
31dc0 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49  out CURSOR_REQUI
31dd0 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72  RESEEK state? Pr
31de0 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63  obably need to c
31df0 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  all.  ** restore
31e00 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
31e10 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65   here..  */.  Me
31e20 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
31e30 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
31e40 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70  ition(pCur);.  p
31e50 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
31e60 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  ge;.  assert( cu
31e70 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
31e80 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
31e90 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43  ( pPage->pBt==pC
31ea0 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74  ur->pBt );.  ret
31eb0 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67  urn pPage ? pPag
31ec0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
31ed0 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a  hdrOffset] : 0;.
31ee0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
31ef0 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63   the pager assoc
31f00 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72  iated with a BTr
31f10 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ee.  This routin
31f20 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  e is used for.**
31f30 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
31f40 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
31f50 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74  Pager *sqlite3Bt
31f60 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a  reePager(Btree *
31f70 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
31f80 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a  pBt->pPager;.}..
31f90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31fa0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
31fb0 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  ECK./*.** Append
31fc0 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68   a message to th
31fd0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
31fe0 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
31ff0 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65  c void checkAppe
32000 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69  ndMsg(.  Integri
32010 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20  tyCk *pCheck,.  
32020 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63  char *zMsg1,.  c
32030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
32040 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76  at,.  ....){.  v
32050 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
32060 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20   !pCheck->mxErr 
32070 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65  ) return;.  pChe
32080 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70  ck->mxErr--;.  p
32090 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Check->nErr++;. 
320a0 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
320b0 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 43  ormat);.  if( pC
320c0 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68  heck->errMsg.nCh
320d0 61 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ar ){.    sqlite
320e0 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
320f0 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c  &pCheck->errMsg,
32100 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20   "\n", 1);.  }. 
32110 20 69 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20   if( zMsg1 ){.  
32120 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
32130 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d  mAppend(&pCheck-
32140 3e 65 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20  >errMsg, zMsg1, 
32150 2d 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  -1);.  }.  sqlit
32160 65 33 56 58 50 72 69 6e 74 66 28 26 70 43 68 65  e3VXPrintf(&pChe
32170 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a  ck->errMsg, 1, z
32180 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
32190 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
321a0 20 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e   pCheck->errMsg.
321b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
321c0 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c      pCheck->mall
321d0 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
321e0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
321f0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
32200 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
32210 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32220 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
32230 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  K./*.** Add 1 to
32240 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
32250 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
32260 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
32270 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
32280 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
32290 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
322a0 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
322b0 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
322c0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
322d0 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
322e0 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
322f0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
32300 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
32310 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
32320 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
32330 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
32340 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
32350 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
32360 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
32370 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
32380 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
32390 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61  , int iPage, cha
323a0 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20  r *zContext){.  
323b0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
323c0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69  eturn 1;.  if( i
323d0 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61  Page>pCheck->nPa
323e0 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b  ge || iPage<0 ){
323f0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
32400 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
32410 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70  text, "invalid p
32420 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20  age number %d", 
32430 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
32440 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
32450 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
32460 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63  age]==1 ){.    c
32470 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
32480 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
32490 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74  "2nd reference t
324a0 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  o page %d", iPag
324b0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
324c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20  ;.  }.  return  
324d0 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69  (pCheck->anRef[i
324e0 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23  Page]++)>1;.}..#
324f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32500 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
32510 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
32520 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  he entry in the 
32530 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20  pointer-map for 
32540 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73  page iChild maps
32550 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61   to .** page iPa
32560 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79  rent, pointer ty
32570 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e  pe ptrType. If n
32580 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72  ot, append an er
32590 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74  ror message.** t
325a0 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61  o pCheck..*/.sta
325b0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74  tic void checkPt
325c0 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74  rmap(.  Integrit
325d0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f  yCk *pCheck,   /
325e0 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
325f0 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  k context */.  P
32600 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
32610 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70        /* Child p
32620 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
32630 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
32640 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
32650 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74  ed pointer map t
32660 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ype */.  Pgno iP
32670 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  arent,          
32680 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
32690 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70  ter map parent p
326a0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
326b0 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
326c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
326d0 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75  t description (u
326e0 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73  sed for error ms
326f0 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  g) */.){.  int r
32700 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54  c;.  u8 ePtrmapT
32710 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  ype;.  Pgno iPtr
32720 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63  mapParent;..  rc
32730 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68   = ptrmapGet(pCh
32740 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64  eck->pBt, iChild
32750 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20  , &ePtrmapType, 
32760 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b  &iPtrmapParent);
32770 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
32780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63  E_OK ){.    chec
32790 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
327a0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61  k, zContext, "Fa
327b0 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72  iled to read ptr
327c0 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68  map key=%d", iCh
327d0 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
327e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74  ;.  }..  if( ePt
327f0 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20  rmapType!=eType 
32800 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  || iPtrmapParent
32810 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  !=iParent ){.   
32820 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32830 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
32840 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74  , .      "Bad pt
32850 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d  r map entry key=
32860 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c  %d expected=(%d,
32870 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22  %d) got=(%d,%d)"
32880 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c  , .      iChild,
32890 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c   eType, iParent,
328a0 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50   ePtrmapType, iP
328b0 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
328c0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
328d0 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
328e0 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
328f0 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f  elist or of an o
32900 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
32910 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  t..** Verify tha
32920 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
32930 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73  pages on the lis
32940 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69  t is N..*/.stati
32950 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74  c void checkList
32960 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
32970 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74  *pCheck,  /* Int
32980 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
32990 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
329a0 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20   isFreeList,    
329b0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
329c0 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73   freelist.  Fals
329d0 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e for overflow p
329e0 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  age list */.  in
329f0 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
32a00 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
32a10 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67  er for first pag
32a20 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  e in the list */
32a30 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
32a40 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
32a50 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70  cted number of p
32a60 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
32a70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
32a80 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43  text        /* C
32a90 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
32aa0 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a   messages */.){.
32ab0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65    int i;.  int e
32ac0 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69  xpected = N;.  i
32ad0 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67  nt iFirst = iPag
32ae0 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  e;.  while( N-- 
32af0 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  > 0 && pCheck->m
32b00 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61  xErr ){.    DbPa
32b10 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20  ge *pOvflPage;. 
32b20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
32b30 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20   *pOvflData;.   
32b40 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a   if( iPage<1 ){.
32b50 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
32b60 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
32b70 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
32b80 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20  "%d of %d pages 
32b90 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65  missing from ove
32ba0 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74  rflow list start
32bb0 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20  ing at %d",.    
32bc0 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63        N+1, expec
32bd0 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  ted, iFirst);.  
32be0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
32bf0 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
32c00 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
32c10 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65   zContext) ) bre
32c20 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
32c30 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65  te3PagerGet(pChe
32c40 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e  ck->pPager, (Pgn
32c50 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50  o)iPage, &pOvflP
32c60 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  age) ){.      ch
32c70 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
32c80 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
32c90 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61  failed to get pa
32ca0 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
32cb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32cc0 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61   }.    pOvflData
32cd0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
32ce0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
32cf0 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67  GetData(pOvflPag
32d00 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72  e);.    if( isFr
32d10 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  eeList ){.      
32d20 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65  int n = get4byte
32d30 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b  (&pOvflData[4]);
32d40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32d50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32d60 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
32d70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
32d80 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
32d90 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
32da0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
32db0 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
32dc0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
32dd0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
32de0 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75  n>pCheck->pBt->u
32df0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 20 29 7b  sableSize/4-2 ){
32e00 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
32e10 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32e20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
32e30 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c       "freelist l
32e40 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69  eaf count too bi
32e50 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69  g on page %d", i
32e60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e  Page);.        N
32e70 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
32e80 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
32e90 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
32ea0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
32eb0 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  ePage = get4byte
32ec0 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a  (&pOvflData[8+i*
32ed0 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
32ee0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32ef0 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66  UUM.          if
32f00 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
32f10 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
32f20 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74           checkPt
32f30 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72  rmap(pCheck, iFr
32f40 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46  eePage, PTRMAP_F
32f50 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
32f60 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  text);.         
32f70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
32f80 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68      checkRef(pCh
32f90 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
32fa0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
32fb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d     }.        N -
32fc0 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
32fd0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
32fe0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32ff0 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  M.    else{.    
33000 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
33010 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
33020 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69  uto-vacuum and i
33030 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Page is not the 
33040 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61  last.      ** pa
33050 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66  ge in this overf
33060 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20  low list, check 
33070 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72  that the pointer
33080 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20  -map entry for. 
33090 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
330a0 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68  owing page match
330b0 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20  es iPage..      
330c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  */.      if( pCh
330d0 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
330e0 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20  cuum && N>0 ){. 
330f0 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62         i = get4b
33100 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
33110 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
33120 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50  map(pCheck, i, P
33130 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
33140 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
33150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33160 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67  .#endif.    iPag
33170 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  e = get4byte(pOv
33180 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  flData);.    sql
33190 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
331a0 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  OvflPage);.  }.}
331b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
331c0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
331d0 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
331e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
331f0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
33200 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20  *.** Do various 
33210 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e  sanity checks on
33220 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f   a single page o
33230 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72  f a tree.  Retur
33240 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65  n.** the tree de
33250 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73  pth.  Root pages
33260 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65   return 0.  Pare
33270 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  nts of root page
33280 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61  s.** return 1, a
33290 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20  nd so forth..** 
332a0 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73  .** These checks
332b0 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a   are done:.**.**
332c0 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73        1.  Make s
332d0 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61  ure that cells a
332e0 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f  nd freeblocks do
332f0 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20   not overlap.** 
33300 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d           but com
33310 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  bine to complete
33320 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67  ly cover the pag
33330 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d  e..**  NO  2.  M
33340 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65  ake sure cell ke
33350 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e  ys are in order.
33360 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b  .**  NO  3.  Mak
33370 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
33380 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
33390 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75  ual to zLowerBou
333a0 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20  nd..**  NO  4.  
333b0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
333c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
333d0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70   or equal to zUp
333e0 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20  perBound..**    
333f0 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20    5.  Check the 
33400 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65  integrity of ove
33410 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20  rflow pages..** 
33420 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69       6.  Recursi
33430 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54  vely call checkT
33440 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63  reePage on all c
33450 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20  hildren..**     
33460 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74   7.  Verify that
33470 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c   the depth of al
33480 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68  l children is th
33490 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20  e same..**      
334a0 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  8.  Make sure th
334b0 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65  is page is at le
334c0 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20  ast 33% full or 
334d0 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20  else it is.**   
334e0 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20         the root 
334f0 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a  of the tree..*/.
33500 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
33510 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65  TreePage(.  Inte
33520 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
33530 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
33540 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   the sanity chec
33550 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  k */.  int iPage
33560 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
33570 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
33580 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b  he page to check
33590 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
335a0 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
335b0 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
335c0 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e  char *zParentCon
335d0 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20  text  /* Parent 
335e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
335f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
33600 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70    int i, rc, dep
33610 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e  th, d2, pgno, cn
33620 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65  t;.  int hdr, ce
33630 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e  llStart;.  int n
33640 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61  Cell;.  u8 *data
33650 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
33660 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  t;.  int usableS
33670 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e  ize;.  char zCon
33680 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61  text[100];.  cha
33690 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74  r *hit;..  sqlit
336a0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
336b0 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  of(zContext), zC
336c0 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64  ontext, "Page %d
336d0 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20  : ", iPage);..  
336e0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
336f0 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20  e page exists.  
33700 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63  */.  pBt = pChec
33710 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65  k->pBt;.  usable
33720 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
33730 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50  leSize;.  if( iP
33740 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
33750 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  0;.  if( checkRe
33760 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
33770 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29   zParentContext)
33780 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
33790 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
337a0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
337b0 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
337c0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b  pPage, 0))!=0 ){
337d0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
337e0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
337f0 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e  text,.       "un
33800 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
33810 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65  page. error code
33820 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72  =%d", rc);.    r
33830 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
33840 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
33850 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
33860 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d  age, pParent))!=
33870 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
33880 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
33890 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
338a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73                "s
338b0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
338c0 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72  age() returns er
338d0 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63  ror code %d", rc
338e0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
338f0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
33900 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
33910 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c  /* Check out all
33920 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f   the cells..  */
33930 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20  .  depth = 0;.  
33940 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
33950 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63  ->nCell && pChec
33960 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  k->mxErr; i++){.
33970 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
33980 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43     int sz;.    C
33990 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
339a0 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c     /* Check payl
339b0 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  oad overflow pag
339c0 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  es.    */.    sq
339d0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
339e0 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c  izeof(zContext),
339f0 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
33a00 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65          "On tree
33a10 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64   page %d cell %d
33a20 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a  : ", iPage, i);.
33a30 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
33a40 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20  Cell(pPage,i);. 
33a50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
33a60 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
33a70 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
33a80 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
33a90 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21  nData;.    if( !
33aa0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20  pPage->intKey ) 
33ab0 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b  sz += info.nKey;
33ac0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d  .    assert( sz=
33ad0 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
33ae0 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66  ;.    if( sz>inf
33af0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
33b00 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73    int nPage = (s
33b10 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  z - info.nLocal 
33b20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35  + usableSize - 5
33b30 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  )/(usableSize - 
33b40 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  4);.      Pgno p
33b50 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
33b60 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
33b70 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e  Overflow]);.#ifn
33b80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33b90 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
33ba0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
33bb0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
33bc0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
33bd0 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  ck, pgnoOvfl, PT
33be0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
33bf0 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
33c00 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
33c10 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74  .      checkList
33c20 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f  (pCheck, 0, pgno
33c30 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f  Ovfl, nPage, zCo
33c40 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  ntext);.    }.. 
33c50 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69     /* Check sani
33c60 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64  ty of left child
33c70 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
33c80 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
33c90 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  af ){.      pgno
33ca0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
33cb0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
33cc0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33cd0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
33ce0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
33cf0 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
33d00 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
33d10 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
33d20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
33d30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
33d40 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63  .      d2 = chec
33d50 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b  kTreePage(pCheck
33d60 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e  ,pgno,pPage,zCon
33d70 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  text);.      if(
33d80 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74   i>0 && d2!=dept
33d90 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  h ){.        che
33da0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
33db0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43  ck, zContext, "C
33dc0 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68 20  hild page depth 
33dd0 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20  differs");.     
33de0 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d   }.      depth =
33df0 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   d2;.    }.  }. 
33e00 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
33e10 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
33e20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
33e30 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
33e40 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
33e50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
33e60 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
33e70 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  t), zContext, . 
33e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e90 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20      "On page %d 
33ea0 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20  at right child: 
33eb0 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64  ", iPage);.#ifnd
33ec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
33ed0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
33ee0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
33ef0 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  m ){.      check
33f00 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
33f10 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
33f20 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20  E, iPage, 0);.  
33f30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
33f40 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
33f50 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  eck, pgno, pPage
33f60 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  , zContext);.  }
33f70 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  . .  /* Check fo
33f80 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72  r complete cover
33f90 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a  age of the page.
33fa0 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50    */.  data = pP
33fb0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
33fc0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
33fd0 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71  fset;.  hit = sq
33fe0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
33ff0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
34000 3b 0a 20 20 69 66 28 20 68 69 74 3d 3d 30 20 29  ;.  if( hit==0 )
34010 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61  {.    pCheck->ma
34020 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
34030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
34040 73 65 74 28 68 69 74 2c 20 30 2c 20 75 73 61 62  set(hit, 0, usab
34050 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65  leSize );.    me
34060 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74  mset(hit, 1, get
34070 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
34080 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  5]));.    nCell 
34090 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
340a0 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65  [hdr+3]);.    ce
340b0 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20  llStart = hdr + 
340c0 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
340d0 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  af;.    for(i=0;
340e0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
340f0 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67        int pc = g
34100 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  et2byte(&data[ce
34110 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20  llStart+i*2]);. 
34120 20 20 20 20 20 75 31 36 20 73 69 7a 65 20 3d 20       u16 size = 
34130 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
34140 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
34150 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
34160 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31    if( (pc+size-1
34170 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
34180 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20   pc<0 ){.       
34190 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
341a0 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20  pCheck, 0, .    
341b0 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
341c0 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
341d0 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
341e0 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
341f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34200 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69       for(j=pc+si
34210 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d  ze-1; j>=pc; j--
34220 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
34230 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f    }.    }.    fo
34240 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62  r(cnt=0, i=get2b
34250 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
34260 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62  ); i>0 && i<usab
34270 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30  leSize && cnt<10
34280 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20  000; .          
34290 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69   cnt++){.      i
342a0 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79  nt size = get2by
342b0 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a  te(&data[i+2]);.
342c0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
342d0 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31     if( (i+size-1
342e0 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c  )>=usableSize ||
342f0 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
34300 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
34310 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20  Check, 0,  .    
34320 20 20 20 20 20 20 20 20 22 43 6f 72 72 75 70 74          "Corrupt
34330 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20  ion detected in 
34340 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20  cell %d on page 
34350 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a  %d",i,iPage,0);.
34360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34370 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a       for(j=i+siz
34380 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20  e-1; j>=i; j--) 
34390 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
343a0 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 32  }.      i = get2
343b0 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a  byte(&data[i]);.
343c0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
343d0 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53  cnt=0; i<usableS
343e0 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ize; i++){.     
343f0 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29   if( hit[i]==0 )
34400 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b  {.        cnt++;
34410 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
34420 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20   hit[i]>1 ){.   
34430 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
34440 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20  Msg(pCheck, 0,. 
34450 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70           "Multip
34460 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79 74 65  le uses for byte
34470 20 25 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c   %d of page %d",
34480 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20   i, iPage);.    
34490 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
344a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
344b0 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37   cnt!=data[hdr+7
344c0 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ] ){.      check
344d0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
344e0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
344f0 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63  "Fragmented spac
34500 65 20 69 73 20 25 64 20 62 79 74 65 20 72 65 70  e is %d byte rep
34510 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70  orted as %d on p
34520 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20  age %d",.       
34530 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72     cnt, data[hdr
34540 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  +7], iPage);.   
34550 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
34560 50 61 67 65 46 72 65 65 28 68 69 74 29 3b 0a 0a  PageFree(hit);..
34570 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
34580 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64  age);.  return d
34590 65 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66  epth+1;.}.#endif
345a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
345b0 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
345c0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
345d0 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
345e0 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  Y_CHECK./*.** Th
345f0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
34600 61 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b  a complete check
34610 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42 54   of the given BT
34620 72 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74  ree file.  aRoot
34630 5b 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61  [] is.** an arra
34640 79 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65  y of pages numbe
34650 72 73 20 77 65 72 65 20 65 61 63 68 20 70 61 67  rs were each pag
34660 65 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20  e number is the 
34670 72 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  root page of.** 
34680 61 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20  a table.  nRoot 
34690 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
346a0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f   entries in aRoo
346b0 74 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  t..**.** Write t
346c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
346d0 6f 72 20 73 65 65 6e 20 69 6e 20 2a 70 6e 45 72  or seen in *pnEr
346e0 72 2e 20 20 45 78 63 65 70 74 20 66 6f 72 20 73  r.  Except for s
346f0 6f 6d 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c  ome memory.** al
34700 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 73 2c  location errors,
34710 20 20 6e 6e 20 65 72 72 6f 72 20 6d 65 73 73 61    nn error messa
34720 67 65 20 69 73 20 68 65 6c 64 20 69 6e 20 6d 65  ge is held in me
34730 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
34740 6f 6d 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 69 73 20  om.** malloc is 
34750 72 65 74 75 72 6e 65 64 20 69 66 20 2a 70 6e 45  returned if *pnE
34760 72 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  rr is non-zero. 
34770 20 49 66 20 2a 70 6e 45 72 72 3d 3d 30 20 74 68   If *pnErr==0 th
34780 65 6e 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 72 65  en NULL is.** re
34790 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
347a0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74  *sqlite3BtreeInt
347b0 65 67 72 69 74 79 43 68 65 63 6b 28 0a 20 20 42  egrityCheck(.  B
347c0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 2f 2a 20  tree *p,     /* 
347d0 54 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  The btree to be 
347e0 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74  checked */.  int
347f0 20 2a 61 52 6f 6f 74 2c 20 20 20 2f 2a 20 41 6e   *aRoot,   /* An
34800 20 61 72 72 61 79 20 6f 66 20 72 6f 6f 74 20 70   array of root p
34810 61 67 65 73 20 6e 75 6d 62 65 72 73 20 66 6f 72  ages numbers for
34820 20 69 6e 64 69 76 69 64 75 61 6c 20 74 72 65 65   individual tree
34830 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 6f 74  s */.  int nRoot
34840 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ,    /* Number o
34850 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f  f entries in aRo
34860 6f 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ot[] */.  int mx
34870 45 72 72 2c 20 20 20 20 2f 2a 20 53 74 6f 70 20  Err,    /* Stop 
34880 72 65 70 6f 72 74 69 6e 67 20 65 72 72 6f 72 73  reporting errors
34890 20 61 66 74 65 72 20 74 68 69 73 20 6d 61 6e 79   after this many
348a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 72 72   */.  int *pnErr
348b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 75 6d      /* Write num
348c0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
348d0 65 6e 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  en to this varia
348e0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
348f0 69 3b 0a 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20  i;.  int nRef;. 
34900 20 49 6e 74 65 67 72 69 74 79 43 6b 20 73 43 68   IntegrityCk sCh
34910 65 63 6b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  eck;.  BtShared 
34920 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
34930 20 63 68 61 72 20 7a 45 72 72 5b 31 30 30 5d 3b   char zErr[100];
34940 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
34950 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
34960 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 6e  >db = p->db;.  n
34970 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
34980 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
34990 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6c  pPager);.  if( l
349a0 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
349b0 79 28 70 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  y(p)!=SQLITE_OK 
349c0 29 7b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20  ){.    *pnErr = 
349d0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  1;.    sqlite3Bt
349e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
349f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 44   return sqlite3D
34a00 62 53 74 72 44 75 70 28 30 2c 20 22 63 61 6e 6e  bStrDup(0, "cann
34a10 6f 74 20 61 63 71 75 69 72 65 20 61 20 72 65 61  ot acquire a rea
34a20 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
34a30 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20 20  tabase");.  }.  
34a40 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42 74  sCheck.pBt = pBt
34a50 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67 65  ;.  sCheck.pPage
34a60 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
34a70 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  .  sCheck.nPage 
34a80 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
34a90 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72 29 3b  (sCheck.pPager);
34aa0 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 20  .  sCheck.mxErr 
34ab0 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68 65 63  = mxErr;.  sChec
34ac0 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 73 43  k.nErr = 0;.  sC
34ad0 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65  heck.mallocFaile
34ae0 64 20 3d 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20  d = 0;.  *pnErr 
34af0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
34b00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
34b10 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  UUM.  if( pBt->n
34b20 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
34b30 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70  sCheck.nPage = p
34b40 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a  Bt->nTrunc;.  }.
34b50 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 43 68  #endif.  if( sCh
34b60 65 63 6b 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  eck.nPage==0 ){.
34b70 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
34b80 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
34b90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
34ba0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
34bb0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65  rn 0;.  }.  sChe
34bc0 63 6b 2e 61 6e 52 65 66 20 3d 20 73 71 6c 69 74  ck.anRef = sqlit
34bd0 65 33 4d 61 6c 6c 6f 63 28 20 28 73 43 68 65 63  e3Malloc( (sChec
34be0 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f  k.nPage+1)*sizeo
34bf0 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30  f(sCheck.anRef[0
34c00 5d 29 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68  ]) );.  if( !sCh
34c10 65 63 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20  eck.anRef ){.   
34c20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
34c30 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a  used(pBt);.    *
34c40 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73  pnErr = 1;.    s
34c50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
34c60 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
34c70 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  0;.  }.  for(i=0
34c80 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67  ; i<=sCheck.nPag
34c90 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e  e; i++){ sCheck.
34ca0 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a  anRef[i] = 0; }.
34cb0 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59    i = PENDING_BY
34cc0 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20  TE_PAGE(pBt);.  
34cd0 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  if( i<=sCheck.nP
34ce0 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63  age ){.    sChec
34cf0 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a  k.anRef[i] = 1;.
34d00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
34d10 41 63 63 75 6d 49 6e 69 74 28 26 73 43 68 65 63  AccumInit(&sChec
34d20 6b 2e 65 72 72 4d 73 67 2c 20 7a 45 72 72 2c 20  k.errMsg, zErr, 
34d30 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c 20 32 30  sizeof(zErr), 20
34d40 30 30 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  000);..  /* Chec
34d50 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
34d60 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  of the freelist.
34d70 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74    */.  checkList
34d80 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74  (&sCheck, 1, get
34d90 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
34da0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a  e1->aData[32]),.
34db0 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34              get4
34dc0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
34dd0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22  1->aData[36]), "
34de0 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22  Main freelist: "
34df0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61  );..  /* Check a
34e00 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20  ll the tables.. 
34e10 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
34e20 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b  <nRoot && sCheck
34e30 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  .mxErr; i++){.  
34e40 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d    if( aRoot[i]==
34e50 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  0 ) continue;.#i
34e60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34e70 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
34e80 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
34e90 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d  cuum && aRoot[i]
34ea0 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  >1 ){.      chec
34eb0 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c  kPtrmap(&sCheck,
34ec0 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41   aRoot[i], PTRMA
34ed0 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30  P_ROOTPAGE, 0, 0
34ee0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
34ef0 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67      checkTreePag
34f00 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  e(&sCheck, aRoot
34f10 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66  [i], 0, "List of
34f20 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b   tree roots: ");
34f30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
34f40 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20  sure every page 
34f50 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  in the file is r
34f60 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20  eferenced.  */. 
34f70 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68   for(i=1; i<=sCh
34f80 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68  eck.nPage && sCh
34f90 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
34fa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
34fb0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
34fc0 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
34fd0 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  Ref[i]==0 ){.   
34fe0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
34ff0 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
35000 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
35010 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
35020 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66  .#else.    /* If
35030 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
35040 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
35050 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f  um, make sure no
35060 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a   tables contain.
35070 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
35080 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70  s to pointer-map
35090 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   pages..    */. 
350a0 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
350b0 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20  Ref[i]==0 && .  
350c0 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47       (PTRMAP_PAG
350d0 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c  ENO(pBt, i)!=i |
350e0 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  | !pBt->autoVacu
350f0 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
35100 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
35110 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
35120 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
35130 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   i);.    }.    i
35140 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
35150 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20  i]!=0 && .      
35160 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
35170 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42  pBt, i)==i && pB
35180 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
35190 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
351a0 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
351b0 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20  0, "Pointer map 
351c0 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72  page %d is refer
351d0 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20  enced", i);.    
351e0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
351f0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  /* Make sure thi
35200 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e  s analysis did n
35210 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72  ot leave any unr
35220 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a  ef() pages.  */.
35230 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
35240 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66  nused(pBt);.  if
35250 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65  ( nRef != sqlite
35260 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
35270 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
35280 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
35290 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20  g(&sCheck, 0, . 
352a0 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e       "Outstandin
352b0 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65  g page count goe
352c0 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20  s from %d to %d 
352d0 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c  during this anal
352e0 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65  ysis",.      nRe
352f0 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  f, sqlite3PagerR
35300 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
35310 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  ger).    );.  }.
35320 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20  .  /* Clean  up 
35330 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72  and report error
35340 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
35350 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
35360 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
35370 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20  Check.anRef);.  
35380 69 66 28 20 73 43 68 65 63 6b 2e 6d 61 6c 6c 6f  if( sCheck.mallo
35390 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
353a0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 52 65  qlite3StrAccumRe
353b0 73 65 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d  set(&sCheck.errM
353c0 73 67 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20  sg);.    *pnErr 
353d0 3d 20 73 43 68 65 63 6b 2e 6e 45 72 72 2b 31 3b  = sCheck.nErr+1;
353e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
353f0 20 7d 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43   }.  *pnErr = sC
35400 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 69 66 28  heck.nErr;.  if(
35410 20 73 43 68 65 63 6b 2e 6e 45 72 72 3d 3d 30 20   sCheck.nErr==0 
35420 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75  ) sqlite3StrAccu
35430 6d 52 65 73 65 74 28 26 73 43 68 65 63 6b 2e 65  mReset(&sCheck.e
35440 72 72 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e  rrMsg);.  return
35450 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
35460 46 69 6e 69 73 68 28 26 73 43 68 65 63 6b 2e 65  Finish(&sCheck.e
35470 72 72 4d 73 67 29 3b 0a 7d 0a 23 65 6e 64 69 66  rrMsg);.}.#endif
35480 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
35490 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20  INTEGRITY_CHECK 
354a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
354b0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
354c0 6d 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  me of the underl
354d0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
354e0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  le..**.** The pa
354f0 67 65 72 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  ger filename is 
35500 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e  invariant as lon
35510 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69  g as the pager i
35520 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20  s.** open so it 
35530 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73  is safe to acces
35540 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74  s without the Bt
35550 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f  Shared mutex..*/
35560 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
35570 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
35580 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  name(Btree *p){.
35590 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74    assert( p->pBt
355a0 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ->pPager!=0 );. 
355b0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
355c0 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e  agerFilename(p->
355d0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a  pBt->pPager);.}.
355e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
355f0 65 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  e pathname of th
35600 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
35610 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
35620 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
35630 2a 2a 20 54 68 65 20 70 61 67 65 72 20 64 69 72  ** The pager dir
35640 65 63 74 6f 72 79 20 6e 61 6d 65 20 69 73 20 69  ectory name is i
35650 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67  nvariant as long
35660 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73   as the pager is
35670 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69  .** open so it i
35680 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73  s safe to access
35690 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53   without the BtS
356a0 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a  hared mutex..*/.
356b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
356c0 74 65 33 42 74 72 65 65 47 65 74 44 69 72 6e 61  te3BtreeGetDirna
356d0 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  me(Btree *p){.  
356e0 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e  assert( p->pBt->
356f0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72  pPager!=0 );.  r
35700 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67  eturn sqlite3Pag
35710 65 72 44 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74  erDirname(p->pBt
35720 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
35730 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
35740 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
35750 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
35760 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 20 54  this database. T
35770 68 65 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c  he return.** val
35780 75 65 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ue of this routi
35790 6e 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 72  ne is the same r
357a0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
357b0 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ther the journal
357c0 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
357d0 6e 20 63 72 65 61 74 65 64 20 6f 72 20 6e 6f 74  n created or not
357e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
357f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
35800 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
35810 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
35820 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
35830 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
35840 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
35850 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
35860 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
35870 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
35880 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74  etJournalname(Bt
35890 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
358a0 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
358b0 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
358c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
358d0 72 6e 61 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d  rnalname(p->pBt-
358e0 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66  >pPager);.}..#if
358f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35900 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f  _VACUUM./*.** Co
35910 70 79 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  py the complete 
35920 63 6f 6e 74 65 6e 74 20 6f 66 20 70 42 74 46 72  content of pBtFr
35930 6f 6d 20 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20  om into pBtTo.  
35940 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  A transaction.**
35950 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
35960 66 6f 72 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a  for both files..
35970 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  **.** The size o
35980 66 20 66 69 6c 65 20 70 54 6f 20 6d 61 79 20 62  f file pTo may b
35990 65 20 72 65 64 75 63 65 64 20 62 79 20 74 68 69  e reduced by thi
359a0 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20  s operation..** 
359b0 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
359c0 20 77 72 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e   wrong, the tran
359d0 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69  saction on pTo i
359e0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 0a  s rolled back. .
359f0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
35a00 66 75 6c 2c 20 43 6f 6d 6d 69 74 50 68 61 73 65  ful, CommitPhase
35a10 4f 6e 65 28 29 20 6d 61 79 20 62 65 20 63 61 6c  One() may be cal
35a20 6c 65 64 20 6f 6e 20 70 54 6f 20 62 65 66 6f 72  led on pTo befor
35a30 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a  e returning. .**
35a40 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
35a50 6c 64 20 66 69 6e 69 73 68 20 63 6f 6d 6d 69 74  ld finish commit
35a60 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63  ting the transac
35a70 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 62 79 20 63  tion on pTo by c
35a80 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
35a90 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 2e 0a  3BtreeCommit()..
35aa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
35ab0 72 65 65 43 6f 70 79 46 69 6c 65 28 42 74 72 65  reeCopyFile(Btre
35ac0 65 20 2a 70 54 6f 2c 20 42 74 72 65 65 20 2a 70  e *pTo, Btree *p
35ad0 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20  From){.  int rc 
35ae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
35af0 67 6e 6f 20 69 3b 0a 0a 20 20 50 67 6e 6f 20 6e  gno i;..  Pgno n
35b00 46 72 6f 6d 50 61 67 65 3b 20 20 20 20 20 2f 2a  FromPage;     /*
35b10 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
35b20 20 69 6e 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 50   in pFrom */.  P
35b30 67 6e 6f 20 6e 54 6f 50 61 67 65 3b 20 20 20 20  gno nToPage;    
35b40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
35b50 70 61 67 65 73 20 69 6e 20 70 54 6f 20 2a 2f 0a  pages in pTo */.
35b60 20 20 50 67 6e 6f 20 6e 4e 65 77 50 61 67 65 3b    Pgno nNewPage;
35b70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
35b80 6f 66 20 70 61 67 65 73 20 69 6e 20 70 54 6f 20  of pages in pTo 
35b90 61 66 74 65 72 20 74 68 65 20 63 6f 70 79 20 2a  after the copy *
35ba0 2f 0a 0a 20 20 50 67 6e 6f 20 69 53 6b 69 70 3b  /..  Pgno iSkip;
35bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 6e 64           /* Pend
35bc0 69 6e 67 20 62 79 74 65 20 70 61 67 65 20 69 6e  ing byte page in
35bd0 20 70 54 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54   pTo */.  int nT
35be0 6f 50 61 67 65 53 69 7a 65 3b 20 20 20 20 2f 2a  oPageSize;    /*
35bf0 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70 54   Page size of pT
35c00 6f 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  o in bytes */.  
35c10 69 6e 74 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  int nFromPageSiz
35c20 65 3b 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  e;  /* Page size
35c30 20 6f 66 20 70 46 72 6f 6d 20 69 6e 20 62 79 74   of pFrom in byt
35c40 65 73 20 2a 2f 0a 0a 20 20 42 74 53 68 61 72 65  es */..  BtShare
35c50 64 20 2a 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e  d *pBtTo = pTo->
35c60 70 42 74 3b 0a 20 20 42 74 53 68 61 72 65 64 20  pBt;.  BtShared 
35c70 2a 70 42 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  *pBtFrom = pFrom
35c80 2d 3e 70 42 74 3b 0a 20 20 70 42 74 54 6f 2d 3e  ->pBt;.  pBtTo->
35c90 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20  db = pTo->db;.  
35ca0 70 42 74 46 72 6f 6d 2d 3e 64 62 20 3d 20 70 46  pBtFrom->db = pF
35cb0 72 6f 6d 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f 50  rom->db;..  nToP
35cc0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 54 6f 2d  ageSize = pBtTo-
35cd0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 6e 46 72  >pageSize;.  nFr
35ce0 6f 6d 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  omPageSize = pBt
35cf0 46 72 6f 6d 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  From->pageSize;.
35d00 0a 20 20 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72  .  if( pTo->inTr
35d10 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
35d20 20 7c 7c 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61   || pFrom->inTra
35d30 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
35d40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
35d50 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
35d60 20 20 69 66 28 20 70 42 74 54 6f 2d 3e 70 43 75    if( pBtTo->pCu
35d70 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75  rsor ){.    retu
35d80 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
35d90 20 20 7d 0a 0a 20 20 6e 54 6f 50 61 67 65 20 3d    }..  nToPage =
35da0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
35db0 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a  pBtTo->pPager);.
35dc0 20 20 6e 46 72 6f 6d 50 61 67 65 20 3d 20 70 61    nFromPage = pa
35dd0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
35de0 46 72 6f 6d 2d 3e 70 50 61 67 65 72 29 3b 0a 20  From->pPager);. 
35df0 20 69 53 6b 69 70 20 3d 20 50 45 4e 44 49 4e 47   iSkip = PENDING
35e00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 54 6f  _BYTE_PAGE(pBtTo
35e10 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  );..  /* Variabl
35e20 65 20 6e 4e 65 77 50 61 67 65 20 69 73 20 74 68  e nNewPage is th
35e30 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
35e40 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  s required to st
35e50 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e  ore the.  ** con
35e60 74 65 6e 74 73 20 6f 66 20 70 46 72 6f 6d 20 75  tents of pFrom u
35e70 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
35e80 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54   page-size of pT
35e90 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 65 77 50 61  o..  */.  nNewPa
35ea0 67 65 20 3d 20 28 28 69 36 34 29 6e 46 72 6f 6d  ge = ((i64)nFrom
35eb0 50 61 67 65 20 2a 20 28 69 36 34 29 6e 46 72 6f  Page * (i64)nFro
35ec0 6d 50 61 67 65 53 69 7a 65 20 2b 20 28 69 36 34  mPageSize + (i64
35ed0 29 6e 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 31  )nToPageSize - 1
35ee0 29 20 2f 20 0a 20 20 20 20 20 20 28 69 36 34 29  ) / .      (i64)
35ef0 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  nToPageSize;..  
35f00 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c  for(i=1; rc==SQL
35f10 49 54 45 5f 4f 4b 20 26 26 20 28 69 3c 3d 6e 54  ITE_OK && (i<=nT
35f20 6f 50 61 67 65 20 7c 7c 20 69 3c 3d 6e 4e 65 77  oPage || i<=nNew
35f30 50 61 67 65 29 3b 20 69 2b 2b 29 7b 0a 0a 20 20  Page); i++){..  
35f40 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 74 68 65    /* Journal the
35f50 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2e 0a   original page..
35f60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 69 53      **.    ** iS
35f70 6b 69 70 20 69 73 20 74 68 65 20 70 61 67 65 20  kip is the page 
35f80 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 6f  number of the lo
35f90 63 6b 69 6e 67 20 70 61 67 65 20 28 50 45 4e 44  cking page (PEND
35fa0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 29 0a 20  ING_BYTE_PAGE). 
35fb0 20 20 20 2a 2a 20 69 6e 20 64 61 74 61 62 61 73     ** in databas
35fc0 65 20 2a 70 54 6f 20 28 62 65 66 6f 72 65 20 74  e *pTo (before t
35fd0 68 65 20 63 6f 70 79 29 2e 20 54 68 69 73 20 70  he copy). This p
35fe0 61 67 65 20 69 73 20 6e 65 76 65 72 20 77 72 69  age is never wri
35ff0 74 74 65 6e 20 0a 20 20 20 20 2a 2a 20 69 6e 74  tten .    ** int
36000 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
36010 6c 65 2e 20 55 6e 6c 65 73 73 20 69 3d 3d 69 53  le. Unless i==iS
36020 6b 69 70 20 6f 72 20 74 68 65 20 70 61 67 65 20  kip or the page 
36030 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 70  was not.    ** p
36040 72 65 73 65 6e 74 20 69 6e 20 70 54 6f 20 62 65  resent in pTo be
36050 66 6f 72 65 20 74 68 65 20 63 6f 70 79 20 6f 70  fore the copy op
36060 65 72 61 74 69 6f 6e 2c 20 6a 6f 75 72 6e 61 6c  eration, journal
36070 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 54 6f   page i from pTo
36080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36090 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d   i!=iSkip && i<=
360a0 6e 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20 20  nToPage ){.     
360b0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
360c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
360d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
360e0 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
360f0 69 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  i, &pDbPage);.  
36100 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36130 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
36140 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36150 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
36160 3e 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20  >nFromPage ){.  
36170 20 20 20 20 20 20 20 20 2f 2a 20 59 65 61 68 2e          /* Yeah.
36180 20 20 49 74 20 73 65 65 6d 73 20 77 69 65 72 64    It seems wierd
36190 20 74 6f 20 63 61 6c 6c 20 44 6f 6e 74 57 72 69   to call DontWri
361a0 74 65 28 29 20 72 69 67 68 74 20 61 66 74 65 72  te() right after
361b0 20 57 72 69 74 65 28 29 2e 20 42 75 74 0a 20 20   Write(). But.  
361c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
361d0 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 6e  is because the n
361e0 61 6d 65 73 20 6f 66 20 74 68 6f 73 65 20 70 72  ames of those pr
361f0 6f 63 65 64 75 72 65 73 20 64 6f 20 6e 6f 74 20  ocedures do not 
36200 65 78 61 63 74 6c 79 20 0a 20 20 20 20 20 20 20  exactly .       
36210 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20     ** represent 
36220 77 68 61 74 20 74 68 65 79 20 64 6f 2e 20 20 57  what they do.  W
36230 72 69 74 65 28 29 20 72 65 61 6c 6c 79 20 6d 65  rite() really me
36240 61 6e 73 20 22 70 75 74 20 74 68 69 73 20 70 61  ans "put this pa
36250 67 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ge in the.      
36260 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
36270 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 6d 61 72 6b  journal and mark
36280 20 69 74 20 61 73 20 64 69 72 74 79 20 73 6f 20   it as dirty so 
36290 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
362a0 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
362b0 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
362c0 62 61 73 65 20 66 69 6c 65 20 6c 61 74 65 72 2e  base file later.
362d0 22 20 20 44 6f 6e 74 57 72 69 74 65 28 29 20 75  "  DontWrite() u
362e0 6e 64 6f 65 73 20 74 68 65 20 73 65 63 6f 6e 64  ndoes the second
362f0 20 70 61 72 74 20 6f 66 0a 20 20 20 20 20 20 20   part of.       
36300 20 20 20 2a 2a 20 74 68 61 74 20 61 6e 64 20 70     ** that and p
36310 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
36320 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
36330 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
36340 61 73 65 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ase. The.       
36350 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 73 74     ** page is st
36360 69 6c 6c 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  ill on the rollb
36370 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 6f  ack journal, tho
36380 75 67 68 2e 20 20 41 6e 64 20 74 68 61 74 20 69  ugh.  And that i
36390 73 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  s the .         
363a0 20 2a 2a 20 77 68 6f 6c 65 20 70 6f 69 6e 74 20   ** whole point 
363b0 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b 3a 20 74  of this block: t
363c0 6f 20 70 75 74 20 70 61 67 65 73 20 6f 6e 20 74  o put pages on t
363d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
363e0 6e 61 6c 2e 20 0a 20 20 20 20 20 20 20 20 20 20  nal. .          
363f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
36400 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
36410 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
36420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
36430 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36440 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
36450 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
36460 20 4f 76 65 72 77 72 69 74 65 20 74 68 65 20 64   Overwrite the d
36470 61 74 61 20 69 6e 20 70 61 67 65 20 69 20 6f 66  ata in page i of
36480 20 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61   the target data
36490 62 61 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  base */.    if( 
364a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
364b0 20 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d   i!=iSkip && i<=
364c0 6e 4e 65 77 50 61 67 65 20 29 7b 0a 0a 20 20 20  nNewPage ){..   
364d0 20 20 20 44 62 50 61 67 65 20 2a 70 54 6f 50 61     DbPage *pToPa
364e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ge = 0;.      sq
364f0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66  lite3_int64 iOff
36500 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
36510 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
36520 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20  tTo->pPager, i, 
36530 26 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20  &pToPage);.     
36540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
36560 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36570 72 69 74 65 28 70 54 6f 50 61 67 65 29 3b 0a 20  rite(pToPage);. 
36580 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
36590 72 28 0a 20 20 20 20 20 20 20 20 69 4f 66 66 3d  r(.        iOff=
365a0 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a  (i-1)*nToPageSiz
365b0 65 3b 20 0a 20 20 20 20 20 20 20 20 72 63 3d 3d  e; .        rc==
365c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66  SQLITE_OK && iOf
365d0 66 3c 69 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b  f<i*nToPageSize;
365e0 20 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b   .        iOff +
365f0 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a  = nFromPageSize.
36600 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
36610 20 44 62 50 61 67 65 20 2a 70 46 72 6f 6d 50 61   DbPage *pFromPa
36620 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
36630 50 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f  Pgno iFrom = (iO
36640 66 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  ff/nFromPageSize
36650 29 2b 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  )+1;..        if
36660 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47  ( iFrom==PENDING
36670 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 46 72  _BYTE_PAGE(pBtFr
36680 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  om) ){.         
36690 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
366a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
366b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
366c0 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  et(pBtFrom->pPag
366d0 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f  er, iFrom, &pFro
366e0 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
366f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  K ){.          c
36710 68 61 72 20 2a 7a 54 6f 20 3d 20 73 71 6c 69 74  har *zTo = sqlit
36720 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
36730 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ToPage);.       
36740 20 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d     char *zFrom =
36750 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
36760 44 61 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b  Data(pFromPage);
36770 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
36780 43 6f 70 79 3b 0a 0a 20 20 20 20 20 20 20 20 20  Copy;..         
36790 20 69 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69   if( nFromPageSi
367a0 7a 65 3e 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20  ze>=nToPageSize 
367b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
367c0 46 72 6f 6d 20 2b 3d 20 28 28 69 2d 31 29 2a 6e  From += ((i-1)*n
367d0 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 28 28 69  ToPageSize - ((i
367e0 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67  From-1)*nFromPag
367f0 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
36800 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 54 6f       nCopy = nTo
36810 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  PageSize;.      
36820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36830 20 20 20 20 20 20 20 7a 54 6f 20 2b 3d 20 28 28         zTo += ((
36840 28 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50  (iFrom-1)*nFromP
36850 61 67 65 53 69 7a 65 29 20 2d 20 28 69 2d 31 29  ageSize) - (i-1)
36860 2a 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b 0a 20  *nToPageSize);. 
36870 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79             nCopy
36880 20 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65   = nFromPageSize
36890 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
368a0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
368b0 7a 54 6f 2c 20 7a 46 72 6f 6d 2c 20 6e 43 6f 70  zTo, zFrom, nCop
368c0 79 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 50 61  y);..  sqlite3Pa
368d0 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61  gerUnref(pFromPa
368e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
368f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
36900 28 20 70 54 6f 50 61 67 65 20 29 20 73 71 6c 69  ( pToPage ) sqli
36910 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54  te3PagerUnref(pT
36920 6f 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  oPage);.    }.  
36930 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 6e 67  }..  /* If thing
36940 73 20 68 61 76 65 20 77 6f 72 6b 65 64 20 73 6f  s have worked so
36950 20 66 61 72 2c 20 74 68 65 20 64 61 74 61 62 61   far, the databa
36960 73 65 20 66 69 6c 65 20 6d 61 79 20 6e 65 65 64  se file may need
36970 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 74 72 75   to be .  ** tru
36980 6e 63 61 74 65 64 2e 20 54 68 65 20 63 6f 6d 70  ncated. The comp
36990 6c 65 78 20 70 61 72 74 20 69 73 20 74 68 61 74  lex part is that
369a0 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
369b0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  be truncated to.
369c0 20 20 2a 2a 20 61 20 73 69 7a 65 20 74 68 61 74    ** a size that
369d0 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
369e0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 6e  er multiple of n
369f0 54 6f 50 61 67 65 53 69 7a 65 20 2d 20 74 68 65  ToPageSize - the
36a00 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 70 61   current.  ** pa
36a10 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  ge size used by 
36a20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69  the pager associ
36a30 61 74 65 64 20 77 69 74 68 20 42 2d 54 72 65 65  ated with B-Tree
36a40 20 70 54 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   pTo..  **.  ** 
36a50 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 61 79  For example, say
36a60 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
36a70 66 20 70 54 6f 20 69 73 20 32 30 34 38 20 62 79  f pTo is 2048 by
36a80 74 65 73 20 61 6e 64 20 74 68 65 20 6f 72 69 67  tes and the orig
36a90 69 6e 61 6c 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  inal .  ** numbe
36aa0 72 20 6f 66 20 70 61 67 65 73 20 69 73 20 35 20  r of pages is 5 
36ab0 28 31 30 20 4b 42 20 66 69 6c 65 29 2e 20 49 66  (10 KB file). If
36ac0 20 70 46 72 6f 6d 20 68 61 73 20 61 20 70 61 67   pFrom has a pag
36ad0 65 20 73 69 7a 65 20 6f 66 20 31 30 32 34 20 0a  e size of 1024 .
36ae0 20 20 2a 2a 20 62 79 74 65 73 20 61 6e 64 20 39    ** bytes and 9
36af0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
36b00 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
36b10 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 39  e truncated to 9
36b20 4b 42 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  KB..  */.  if( r
36b30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36b40 20 20 20 20 69 66 28 20 6e 46 72 6f 6d 50 61 67      if( nFromPag
36b50 65 53 69 7a 65 21 3d 6e 54 6f 50 61 67 65 53 69  eSize!=nToPageSi
36b60 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
36b70 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 20  te3_file *pFile 
36b80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
36b90 6c 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  le(pBtTo->pPager
36ba0 29 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53 69  );.      i64 iSi
36bb0 7a 65 20 3d 20 28 69 36 34 29 6e 46 72 6f 6d 50  ze = (i64)nFromP
36bc0 61 67 65 53 69 7a 65 20 2a 20 28 69 36 34 29 6e  ageSize * (i64)n
36bd0 46 72 6f 6d 50 61 67 65 3b 0a 20 20 20 20 20 20  FromPage;.      
36be0 69 36 34 20 69 4e 6f 77 20 3d 20 28 69 36 34 29  i64 iNow = (i64)
36bf0 28 28 6e 54 6f 50 61 67 65 3e 6e 4e 65 77 50 61  ((nToPage>nNewPa
36c00 67 65 29 3f 6e 54 6f 50 61 67 65 3a 6e 4e 65 77  ge)?nToPage:nNew
36c10 50 61 67 65 29 20 2a 20 28 69 36 34 29 6e 54 6f  Page) * (i64)nTo
36c20 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20  PageSize; .     
36c30 20 69 36 34 20 69 50 65 6e 64 69 6e 67 20 3d 20   i64 iPending = 
36c40 28 28 69 36 34 29 50 45 4e 44 49 4e 47 5f 42 59  ((i64)PENDING_BY
36c50 54 45 5f 50 41 47 45 28 70 42 74 54 6f 29 2d 31  TE_PAGE(pBtTo)-1
36c60 29 20 2a 28 69 36 34 29 6e 54 6f 50 61 67 65 53  ) *(i64)nToPageS
36c70 69 7a 65 3b 0a 20 20 0a 20 20 20 20 20 20 61 73  ize;.  .      as
36c80 73 65 72 74 28 20 69 53 69 7a 65 3c 3d 69 4e 6f  sert( iSize<=iNo
36c90 77 20 29 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a  w );.  .      /*
36ca0 20 43 6f 6d 6d 69 74 20 70 68 61 73 65 20 6f 6e   Commit phase on
36cb0 65 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  e syncs the jour
36cc0 6e 61 6c 20 66 69 6c 65 20 61 73 73 6f 63 69 61  nal file associa
36cd0 74 65 64 20 77 69 74 68 20 70 54 6f 20 0a 20 20  ted with pTo .  
36ce0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
36cf0 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  g the original d
36d00 61 74 61 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  ata. It does not
36d10 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
36d20 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  se file.      **
36d30 20 69 74 73 65 6c 66 2e 20 41 66 74 65 72 20 64   itself. After d
36d40 6f 69 6e 67 20 74 68 69 73 20 69 74 20 69 73 20  oing this it is 
36d50 73 61 66 65 20 74 6f 20 75 73 65 20 4f 73 54 72  safe to use OsTr
36d60 75 6e 63 61 74 65 28 29 20 61 6e 64 20 6f 74 68  uncate() and oth
36d70 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
36d80 20 41 50 49 73 20 6f 6e 20 74 68 65 20 64 61 74   APIs on the dat
36d90 61 62 61 73 65 20 66 69 6c 65 20 64 69 72 65 63  abase file direc
36da0 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tly..      */.  
36db0 20 20 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20      pBtTo->db = 
36dc0 70 54 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 72  pTo->db;.      r
36dd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
36de0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
36df0 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20 30 2c  BtTo->pPager, 0,
36e00 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66   0, 1);.      if
36e10 28 20 69 53 69 7a 65 3c 69 4e 6f 77 20 26 26 20  ( iSize<iNow && 
36e20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36e30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
36e40 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
36e50 70 46 69 6c 65 2c 20 69 53 69 7a 65 29 3b 0a 20  pFile, iSize);. 
36e60 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
36e70 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 68 61 74  /* The loop that
36e80 20 63 6f 70 69 65 64 20 64 61 74 61 20 66 72 6f   copied data fro
36e90 6d 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d  m database pFrom
36ea0 20 74 6f 20 70 54 6f 20 64 69 64 20 6e 6f 74 0a   to pTo did not.
36eb0 20 20 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74        ** populat
36ec0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
36ed0 67 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 70  ge of database p
36ee0 54 6f 2e 20 49 66 20 74 68 65 20 70 61 67 65 2d  To. If the page-
36ef0 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a  size of.      **
36f00 20 70 46 72 6f 6d 20 69 73 20 73 6d 61 6c 6c 65   pFrom is smalle
36f10 72 20 74 68 61 6e 20 74 68 61 74 20 6f 66 20 70  r than that of p
36f20 54 6f 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  To, this means s
36f30 6f 6d 65 20 64 61 74 61 20 77 69 6c 6c 0a 20 20  ome data will.  
36f40 20 20 20 20 2a 2a 20 6e 6f 74 20 68 61 76 65 20      ** not have 
36f50 62 65 65 6e 20 63 6f 70 69 65 64 2e 20 0a 20 20  been copied. .  
36f60 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
36f70 54 68 69 73 20 62 6c 6f 63 6b 20 63 6f 70 69 65  This block copie
36f80 73 20 74 68 65 20 6d 69 73 73 69 6e 67 20 64 61  s the missing da
36f90 74 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  ta from database
36fa0 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 0a 20   pFrom to pTo . 
36fb0 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 66 69       ** using fi
36fc0 6c 65 20 41 50 49 73 2e 20 54 68 69 73 20 69 73  le APIs. This is
36fd0 20 73 61 66 65 20 62 65 63 61 75 73 65 20 61 74   safe because at
36fe0 20 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20 6b   this point we k
36ff0 6e 6f 77 20 74 68 61 74 0a 20 20 20 20 20 20 2a  now that.      *
37000 2a 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 72 69  * all of the ori
37010 67 69 6e 61 6c 20 64 61 74 61 20 66 72 6f 6d 20  ginal data from 
37020 70 54 6f 20 68 61 73 20 62 65 65 6e 20 73 79 6e  pTo has been syn
37030 63 65 64 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ced into the .  
37040 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
37050 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
37060 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65 20 73  nt it would be s
37070 61 66 65 20 74 6f 20 64 6f 20 61 6e 79 74 68 69  afe to do anythi
37080 6e 67 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 61  ng at.      ** a
37090 6c 6c 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ll to the databa
370a0 73 65 20 66 69 6c 65 20 65 78 63 65 70 74 20 74  se file except t
370b0 72 75 6e 63 61 74 65 20 69 74 20 74 6f 20 7a 65  runcate it to ze
370c0 72 6f 20 62 79 74 65 73 2e 0a 20 20 20 20 20 20  ro bytes..      
370d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
370e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 46  =SQLITE_OK && nF
370f0 72 6f 6d 50 61 67 65 53 69 7a 65 3c 6e 54 6f 50  romPageSize<nToP
37100 61 67 65 53 69 7a 65 20 26 26 20 69 53 69 7a 65  ageSize && iSize
37110 3e 69 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  >iPending){.    
37120 20 20 20 20 69 36 34 20 69 4f 66 66 3b 0a 20 20      i64 iOff;.  
37130 20 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20        for(.     
37140 20 20 20 20 20 69 4f 66 66 3d 69 50 65 6e 64 69       iOff=iPendi
37150 6e 67 3b 20 0a 20 20 20 20 20 20 20 20 20 20 72  ng; .          r
37160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
37170 69 4f 66 66 3c 28 69 50 65 6e 64 69 6e 67 2b 6e  iOff<(iPending+n
37180 54 6f 50 61 67 65 53 69 7a 65 29 3b 20 0a 20 20  ToPageSize); .  
37190 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
371a0 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20  nFromPageSize.  
371b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
371c0 20 20 20 44 62 50 61 67 65 20 2a 70 46 72 6f 6d     DbPage *pFrom
371d0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
371e0 20 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d 20 3d      Pgno iFrom =
371f0 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61 67 65   (iOff/nFromPage
37200 53 69 7a 65 29 2b 31 3b 0a 20 20 0a 20 20 20 20  Size)+1;.  .    
37210 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
37220 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
37230 47 45 28 70 42 74 46 72 6f 6d 29 20 7c 7c 20 69  GE(pBtFrom) || i
37240 46 72 6f 6d 3e 6e 46 72 6f 6d 50 61 67 65 20 29  From>nFromPage )
37250 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
37260 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
37270 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 20    }.  .         
37280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37290 65 72 47 65 74 28 70 42 74 46 72 6f 6d 2d 3e 70  erGet(pBtFrom->p
372a0 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c 20 26 70  Pager, iFrom, &p
372b0 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
372c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
372d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
372e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 72 6f        char *zFro
372f0 6d 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  m = sqlite3Pager
37300 47 65 74 44 61 74 61 28 70 46 72 6f 6d 50 61 67  GetData(pFromPag
37310 65 29 3b 0a 20 20 09 20 20 72 63 20 3d 20 73 71  e);.  .  rc = sq
37320 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 46 69  lite3OsWrite(pFi
37330 6c 65 2c 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d  le, zFrom, nFrom
37340 50 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 29 3b  PageSize, iOff);
37350 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
37360 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
37370 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
37380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
37390 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
373a0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
373b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
373c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
373d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
373e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
373f0 67 65 72 53 79 6e 63 28 70 42 74 54 6f 2d 3e 70  gerSync(pBtTo->p
37400 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
37410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37420 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37430 65 72 54 72 75 6e 63 61 74 65 28 70 42 74 54 6f  erTruncate(pBtTo
37440 2d 3e 70 50 61 67 65 72 2c 20 6e 4e 65 77 50 61  ->pPager, nNewPa
37450 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
37460 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37470 20 29 7b 0a 20 20 20 20 20 20 70 42 74 54 6f 2d   ){.      pBtTo-
37480 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
37490 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
374a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
374b0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
374c0 61 63 6b 28 70 54 6f 29 3b 0a 20 20 7d 0a 0a 20  ack(pTo);.  }.. 
374d0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
374e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
374f0 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
37500 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
37510 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
37520 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
37530 72 28 70 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65  r(pTo);.  sqlite
37540 33 42 74 72 65 65 45 6e 74 65 72 28 70 46 72 6f  3BtreeEnter(pFro
37550 6d 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  m);.  rc = btree
37560 43 6f 70 79 46 69 6c 65 28 70 54 6f 2c 20 70 46  CopyFile(pTo, pF
37570 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rom);.  sqlite3B
37580 74 72 65 65 4c 65 61 76 65 28 70 46 72 6f 6d 29  treeLeave(pFrom)
37590 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
375a0 4c 65 61 76 65 28 70 54 6f 29 3b 0a 20 20 72 65  Leave(pTo);.  re
375b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
375c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
375d0 54 5f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a  T_VACUUM */../*.
375e0 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
375f0 72 6f 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ro if a transact
37600 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
37610 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
37620 65 65 49 73 49 6e 54 72 61 6e 73 28 42 74 72 65  eeIsInTrans(Btre
37630 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
37640 20 70 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33   p==0 || sqlite3
37650 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
37660 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
37670 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 2d 3e  eturn (p && (p->
37680 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
37690 52 49 54 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  RITE));.}../*.**
376a0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
376b0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
376c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
376d0 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
376e0 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 53 74  lite3BtreeIsInSt
376f0 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
37700 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
37710 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
37720 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ) );.  return (p
37730 2d 3e 70 42 74 20 26 26 20 70 2d 3e 70 42 74 2d  ->pBt && p->pBt-
37740 3e 69 6e 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a  >inStmt);.}../*.
37750 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** Return non-ze
37760 72 6f 20 69 66 20 61 20 72 65 61 64 20 28 6f 72  ro if a read (or
37770 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
37780 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
37790 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
377a0 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
377b0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
377c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
377d0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
377e0 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
377f0 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72  n (p && (p->inTr
37800 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29  ans!=TRANS_NONE)
37810 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
37820 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
37830 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
37840 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
37850 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
37860 2a 2a 20 61 20 73 69 6e 67 6c 65 20 73 68 61 72  ** a single shar
37870 65 64 2d 62 74 72 65 65 2e 20 54 68 65 20 6d 65  ed-btree. The me
37880 6d 6f 72 79 20 69 73 20 75 73 65 64 20 62 79 20  mory is used by 
37890 63 6c 69 65 6e 74 20 63 6f 64 65 20 66 6f 72 20  client code for 
378a0 69 74 73 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f  its own.** purpo
378b0 73 65 73 20 28 66 6f 72 20 65 78 61 6d 70 6c 65  ses (for example
378c0 2c 20 74 6f 20 73 74 6f 72 65 20 61 20 68 69 67  , to store a hig
378d0 68 2d 6c 65 76 65 6c 20 73 63 68 65 6d 61 20 61  h-level schema a
378e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
378f0 2a 2a 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  ** the shared-bt
37900 72 65 65 29 2e 20 54 68 65 20 62 74 72 65 65 20  ree). The btree 
37910 6c 61 79 65 72 20 6d 61 6e 61 67 65 73 20 72 65  layer manages re
37920 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67  ference counting
37930 20 69 73 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54   issues..**.** T
37940 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
37950 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  is is called on 
37960 61 20 73 68 61 72 65 64 2d 62 74 72 65 65 2c 20  a shared-btree, 
37970 6e 42 79 74 65 73 20 62 79 74 65 73 20 6f 66 20  nBytes bytes of 
37980 6d 65 6d 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c  memory.** are al
37990 6c 6f 63 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c  located, zeroed,
379a0 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 74 6f   and returned to
379b0 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72   the caller. For
379c0 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
379d0 20 0a 2a 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42   .** call the nB
379e0 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69  ytes parameter i
379f0 73 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 61 20  s ignored and a 
37a00 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
37a10 61 6d 65 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d  ame blob.** of m
37a20 65 6d 6f 72 79 20 72 65 74 75 72 6e 65 64 2e 20  emory returned. 
37a30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 42  .**.** If the nB
37a40 79 74 65 73 20 70 61 72 61 6d 65 74 65 72 20 69  ytes parameter i
37a50 73 20 30 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  s 0 and the blob
37a60 20 6f 66 20 6d 65 6d 6f 72 79 20 68 61 73 20 6e   of memory has n
37a70 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 61  ot yet been.** a
37a80 6c 6c 6f 63 61 74 65 64 2c 20 61 20 6e 75 6c 6c  llocated, a null
37a90 20 70 6f 69 6e 74 65 72 20 69 73 20 72 65 74 75   pointer is retu
37aa0 72 6e 65 64 2e 20 49 66 20 74 68 65 20 62 6c 6f  rned. If the blo
37ab0 62 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  b has already be
37ac0 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c  en.** allocated,
37ad0 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
37ae0 61 73 20 6e 6f 72 6d 61 6c 2e 0a 2a 2a 0a 2a 2a  as normal..**.**
37af0 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   Just before the
37b00 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73   shared-btree is
37b10 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e   closed, the fun
37b20 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ction passed as 
37b30 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72  the .** xFree ar
37b40 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20  gument when the 
37b50 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
37b60 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e  n was made is in
37b70 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a  voked on the .**
37b80 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74   blob of allocat
37b90 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20  ed memory. This 
37ba0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
37bb0 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  not call sqlite3
37bc0 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68  _free().** on th
37bd0 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74  e memory, the bt
37be0 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74  ree layer does t
37bf0 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  hat..*/.void *sq
37c00 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
37c10 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
37c20 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72  Bytes, void(*xFr
37c30 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20  ee)(void *)){.  
37c40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
37c50 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
37c60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
37c70 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68    if( !pBt->pSch
37c80 65 6d 61 20 26 26 20 6e 42 79 74 65 73 20 29 7b  ema && nBytes ){
37c90 0a 20 20 20 20 70 42 74 2d 3e 70 53 63 68 65 6d  .    pBt->pSchem
37ca0 61 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  a = sqlite3Mallo
37cb0 63 5a 65 72 6f 28 6e 42 79 74 65 73 29 3b 0a 20  cZero(nBytes);. 
37cc0 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
37cd0 65 6d 61 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d  ema = xFree;.  }
37ce0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
37cf0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
37d00 6e 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a  n pBt->pSchema;.
37d10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
37d20 74 72 75 65 20 69 66 20 61 6e 6f 74 68 65 72 20  true if another 
37d30 75 73 65 72 20 6f 66 20 74 68 65 20 73 61 6d 65  user of the same
37d40 20 73 68 61 72 65 64 20 62 74 72 65 65 20 61 73   shared btree as
37d50 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a   the argument.**
37d60 20 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e   handle holds an
37d70 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
37d80 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
37d90 73 74 65 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ster table..*/.i
37da0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
37db0 63 68 65 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65  chemaLocked(Btre
37dc0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
37dd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37de0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
37df0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
37e00 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
37e10 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 71  er(p);.  rc = (q
37e20 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
37e30 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
37e40 41 44 5f 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45  AD_LOCK)!=SQLITE
37e50 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  _OK);.  sqlite3B
37e60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
37e70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23  return rc;.}...#
37e80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37e90 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
37ea0 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c  /*.** Obtain a l
37eb0 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
37ec0 20 77 68 6f 73 65 20 72 6f 6f 74 20 70 61 67 65   whose root page
37ed0 20 69 73 20 69 54 61 62 2e 20 20 54 68 65 0a 2a   is iTab.  The.*
37ee0 2a 20 6c 6f 63 6b 20 69 73 20 61 20 77 72 69 74  * lock is a writ
37ef0 65 20 6c 6f 63 6b 20 69 66 20 69 73 57 72 69 74  e lock if isWrit
37f00 65 6c 6f 63 6b 20 69 73 20 74 72 75 65 20 6f 72  elock is true or
37f10 20 61 20 72 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20   a read lock.** 
37f20 69 66 20 69 74 20 69 73 20 66 61 6c 73 65 2e 0a  if it is false..
37f30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
37f40 72 65 65 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72  reeLockTable(Btr
37f50 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c  ee *p, int iTab,
37f60 20 75 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 29   u8 isWriteLock)
37f70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
37f80 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
37f90 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
37fa0 20 75 38 20 6c 6f 63 6b 54 79 70 65 20 3d 20 52   u8 lockType = R
37fb0 45 41 44 5f 4c 4f 43 4b 20 2b 20 69 73 57 72 69  EAD_LOCK + isWri
37fc0 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 61 73 73 65  teLock;.    asse
37fd0 72 74 28 20 52 45 41 44 5f 4c 4f 43 4b 2b 31 3d  rt( READ_LOCK+1=
37fe0 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
37ff0 20 20 20 61 73 73 65 72 74 28 20 69 73 57 72 69     assert( isWri
38000 74 65 4c 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73 57  teLock==0 || isW
38010 72 69 74 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  riteLock==1 );. 
38020 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
38030 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
38040 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  = queryTableLock
38050 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79  (p, iTab, lockTy
38060 70 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  pe);.    if( rc=
38070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38080 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62      rc = lockTab
38090 6c 65 28 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b  le(p, iTab, lock
380a0 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Type);.    }.   
380b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
380c0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
380d0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
380e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
380f0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
38100 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43  *.** Argument pC
38110 73 72 20 6d 75 73 74 20 62 65 20 61 20 63 75 72  sr must be a cur
38120 73 6f 72 20 6f 70 65 6e 65 64 20 66 6f 72 20 77  sor opened for w
38130 72 69 74 69 6e 67 20 6f 6e 20 61 6e 20 0a 2a 2a  riting on an .**
38140 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 20 63 75   INTKEY table cu
38150 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
38160 20 61 74 20 61 20 76 61 6c 69 64 20 74 61 62 6c   at a valid tabl
38170 65 20 65 6e 74 72 79 2e 20 0a 2a 2a 20 54 68 69  e entry. .** Thi
38180 73 20 66 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66  s function modif
38190 69 65 73 20 74 68 65 20 64 61 74 61 20 73 74 6f  ies the data sto
381a0 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
381b0 68 61 74 20 65 6e 74 72 79 2e 0a 2a 2a 20 4f 6e  hat entry..** On
381c0 6c 79 20 74 68 65 20 64 61 74 61 20 63 6f 6e 74  ly the data cont
381d0 65 6e 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ent may only be 
381e0 6d 6f 64 69 66 69 65 64 2c 20 69 74 20 69 73 20  modified, it is 
381f0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20  not possible.** 
38200 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 6c 65  to change the le
38210 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
38220 20 73 74 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20   stored..*/.int 
38230 73 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44  sqlite3BtreePutD
38240 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
38250 73 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  sr, u32 offset, 
38260 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 7a  u32 amt, void *z
38270 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
38280 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
38290 73 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sr) );.  assert(
382a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
382b0 65 6c 64 28 70 43 73 72 2d 3e 70 42 74 72 65 65  eld(pCsr->pBtree
382c0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
382d0 20 20 61 73 73 65 72 74 28 70 43 73 72 2d 3e 69    assert(pCsr->i
382e0 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29  sIncrblobHandle)
382f0 3b 0a 0a 20 20 72 65 73 74 6f 72 65 43 75 72 73  ;..  restoreCurs
38300 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 73 72 29  orPosition(pCsr)
38310 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
38320 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
38330 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
38340 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61    if( pCsr->eSta
38350 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
38360 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
38370 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
38380 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d  ..  /* Check som
38390 65 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  e preconditions:
383a0 20 0a 20 20 2a 2a 20 20 20 28 61 29 20 74 68 65   .  **   (a) the
383b0 20 63 75 72 73