/ Hex Artifact Content
Login

Artifact ca75bce3383240f9fb14590ddfcd72883cc09609:


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 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
03f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0400: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0410: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0420: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0430: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0440: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0450: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0460: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0470: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0480: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0490: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
04a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
04b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
04c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
04d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
04e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
04f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0500: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0510: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0520: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0530: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0540: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0550: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0560: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0570: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0580: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0590: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
05a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
05b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
05c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
05d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
05e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
05f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0600: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0610: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0620: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0630: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0640: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0650: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0660: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0670: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0680: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0690: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
06a0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
06b0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
06c0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
06d0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
06e0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
06f0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0700: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0710: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0720: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0730: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0740: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0750: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0760: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0770: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0790: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
07a0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
07b0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
07c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
07d0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
07e0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
07f0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0800: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0810: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0820: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0830: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0840: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0850: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0860: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0870: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0880: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0890: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
08a0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
08b0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
08c0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
08d0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
08e0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
08f0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0900: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0910: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0920: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0930: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0940: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0950: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0960: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0970: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0980: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0990: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
09a0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
09b0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
09c0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
09d0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
09e0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
09f0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0a00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0a10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0a20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0a30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0a40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0a50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0a60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0a70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0a80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0a90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0aa0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0ab0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ac0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ad0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ae0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0af0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0b00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0b10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0b20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0b30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0b40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0b50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0b60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0b70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0b80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0b90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0ba0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0bb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0bc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0bd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0be0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0bf0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
0c00: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
0c10: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c20: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
0c30: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
0c40: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
0c50: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
0c60: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
0c70: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
0c80: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
0c90: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
0ca0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
0cb0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
0cc0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
0cd0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
0ce0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
0cf0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
0d00: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
0d10: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
0d20: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
0d30: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
0d40: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
0d50: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
0d60: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
0d70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0d80: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
0d90: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
0da0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
0db0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
0dc0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
0dd0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
0de0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
0df0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
0e00: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
0e10: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
0e20: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
0e30: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
0e40: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
0e50: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
0e60: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
0e70: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
0e80: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
0e90: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0ea0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
0eb0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
0ec0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
0ed0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
0ee0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
0ef0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
0f00: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
0f10: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
0f20: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0f30: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
0f40: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
0f50: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
0f60: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
0f70: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
0f80: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
0f90: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
0fa0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
0fb0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
0fc0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
0fd0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
0fe0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
0ff0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1000: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1010: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1020: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1030: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1040: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1050: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1060: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1070: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1080: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1090: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
10a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
10b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
10c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
10d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
10e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
10f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1100: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1110: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1120: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1130: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1140: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1150: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1160: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1170: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1180: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1190: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
11a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
11b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
11c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
11d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
11e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
11f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1200: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1210: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1220: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1230: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1240: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1250: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1260: 2d 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  ->flags&DB_Schem
1270: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1280: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1290: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
12a0: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
12b0: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
12c0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
12d0: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
12e0: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
12f0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1300: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1310: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1320: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1330: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1340: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1350: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1360: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1370: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1380: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1390: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
13a0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
13b0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
13c0: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
13d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
13e0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
13f0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1400: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1410: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1420: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1430: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61  t ){.        iTa
1440: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1450: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1460: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1470: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1480: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1490: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
14a0: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
14b0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
14c0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
14d0: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
14e0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
14f0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1500: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1510: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1520: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1530: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1540: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1550: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1560: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1570: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1580: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1590: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
15a0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
15b0: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
15c0: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
15d0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
15e0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
15f0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1600: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1610: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1620: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1630: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1640: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1650: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1660: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1670: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1680: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1690: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
16a0: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
16b0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
16c0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16d0: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
16e0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
16f0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1700: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1710: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1720: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1730: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
1740: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
1750: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
1760: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
1770: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
1780: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
1790: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
17a0: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
17b0: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
17c0: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
17d0: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
17e0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
17f0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
1800: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
1810: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
1820: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
1830: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
1840: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1850: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
1860: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
1870: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
1880: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
1890: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
18a0: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
18b0: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
18c0: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
18d0: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
18e0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
18f0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
1900: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
1910: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
1920: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
1930: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
1940: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
1950: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
1960: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
1970: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
1980: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
1990: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
19a0: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
19b0: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
19c0: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
19d0: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
19e0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
19f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1a00: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1a10: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
1a20: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
1a30: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
1a40: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
1a50: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
1a60: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
1a70: 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20  mitted).    ){. 
1a80: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1aa0: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20  n 0;.}.#endif   
1ab0: 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54   /* #ifdef SQLIT
1ac0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
1ad0: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
1ae0: 66 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  f Btree handle p
1af0: 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f   may obtain a lo
1b00: 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b  ck of type eLock
1b10: 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20   .** (READ_LOCK 
1b20: 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f  or WRITE_LOCK) o
1b30: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
1b40: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e   root-page iTab.
1b50: 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   Return.** SQLIT
1b60: 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b  E_OK if the lock
1b70: 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
1b80: 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   (by calling.** 
1b90: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1ba0: 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53  bleLock()), or S
1bb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
1bc0: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
1bd0: 6e 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61  nt querySharedCa
1be0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  cheTableLock(Btr
1bf0: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
1c00: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
1c10: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c20: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
1c30: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
1c40: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1c50: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1c60: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
1c70: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
1c80: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1c90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1ca0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
1cb0: 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  t( !(p->db->flag
1cc0: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
1cd0: 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b  ommitted)||eLock
1ce0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54  ==WRITE_LOCK||iT
1cf0: 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a  ab==1 );.  .  /*
1d00: 20 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61   If requesting a
1d10: 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65   write-lock, the
1d20: 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74  n the Btree must
1d30: 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1d40: 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ite.  ** transac
1d50: 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c  tion on this fil
1d60: 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c  e. And, obviousl
1d70: 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62  y, for this to b
1d80: 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a  e so there .  **
1d90: 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e   must be an open
1da0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1db0: 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  on on the file i
1dc0: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73  tself..  */.  as
1dd0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1de0: 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42  D_LOCK || (p==pB
1df0: 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d  t->pWriter && p-
1e00: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e10: 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65  WRITE) );.  asse
1e20: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
1e30: 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  LOCK || pBt->inT
1e40: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1e50: 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20  S_WRITE );.  .  
1e60: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
1e70: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1e80: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1e90: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1ea0: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1eb0: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
1ec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1ed0: 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f  ..  /* If some o
1ee0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1ef0: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78  is holding an ex
1f00: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68  clusive lock, th
1f10: 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  e.  ** requested
1f20: 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65   lock may not be
1f30: 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a   obtained..  */.
1f40: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
1f50: 65 72 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73  er!=p && pBt->is
1f60: 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
1f70: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1f80: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1f90: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1fa0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
1fb0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1fc0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
1fd0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1fe0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1ff0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2000: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2010: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2020: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2030: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2040: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2050: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2060: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2070: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2080: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2090: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
20a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
20b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
20c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
20d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
20e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
20f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2100: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2110: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2120: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2130: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2140: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2150: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2160: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2170: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2180: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2190: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
21a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
21b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
21d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
21e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
21f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2200: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2210: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2220: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2230: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2240: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2250: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2260: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2270: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2280: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2290: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
22a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
22b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
22c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
22d0: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
22e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
22f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2300: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
2310: 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  HE;.    }.  }.  
2320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2330: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  ;.}.#endif /* !S
2340: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2350: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e  D_CACHE */..#ifn
2360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2370: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
2380: 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e  ** Add a lock on
2390: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
23a0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
23b0: 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
23c0: 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20  tree used.** by 
23d0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20  Btree handle p. 
23e0: 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20  Parameter eLock 
23f0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52  must be either R
2400: 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20  EAD_LOCK or .** 
2410: 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  WRITE_LOCK..**.*
2420: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2430: 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c  assumes the foll
2440: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  owing:.**.**   (
2450: 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64  a) The specified
2460: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20   Btree object p 
2470: 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  is connected to 
2480: 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20  a sharable.**   
2490: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e      database (on
24a0: 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61  e with the BtSha
24b0: 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61  red.sharable fla
24c0: 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  g set), and.**.*
24d0: 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72  *   (b) No other
24e0: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68   Btree objects h
24f0: 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20  old a lock that 
2500: 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20  conflicts.**    
2510: 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75     with the requ
2520: 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e  ested lock (i.e.
2530: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
2540: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73  eTableLock() has
2550: 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64  .**       alread
2560: 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e  y been called an
2570: 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  d returned SQLIT
2580: 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  E_OK)..**.** SQL
2590: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25a0: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
25b0: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
25c0: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d  ully. SQLITE_NOM
25d0: 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  EM .** is return
25e0: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61  ed if a malloc a
25f0: 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f  ttempt fails..*/
2600: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53  .static int setS
2610: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2620: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
2630: 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c  no iTable, u8 eL
2640: 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ock){.  BtShared
2650: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2660: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
2670: 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  = 0;.  BtLock *p
2680: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2690: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
26a0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
26b0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
26c0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
26d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
26e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
26f0: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63  !=0 );..  /* A c
2700: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74  onnection with t
2710: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
2720: 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c  ted flag set wil
2730: 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20  l never try to. 
2740: 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61   ** obtain a rea
2750: 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69  d-lock using thi
2760: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  s function. The 
2770: 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  only read-lock o
2780: 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20  btained.  ** by 
2790: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  a connection in 
27a0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
27b0: 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20   mode is on the 
27c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20  sqlite_master . 
27d0: 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74   ** table, and t
27e0: 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  hat lock is obta
27f0: 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67  ined in BtreeBeg
2800: 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20  inTrans().  */. 
2810: 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e   assert( 0==(p->
2820: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
2830: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
2840: 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  ) || eLock==WRIT
2850: 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
2860: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
2870: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
2880: 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c  led on a sharabl
2890: 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69  e b-tree after i
28a0: 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  t .  ** has been
28b0: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
28c0: 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65   no other b-tree
28d0: 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63   holds a conflic
28e0: 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  ting lock.  */. 
28f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
2900: 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
2910: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65  ( SQLITE_OK==que
2920: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
2930: 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
2940: 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f  , eLock) );..  /
2950: 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74  * First search t
2960: 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65  he list for an e
2970: 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20  xisting lock on 
2980: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
2990: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
29a0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
29b0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
29c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
29d0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
29e0: 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65   && pIter->pBtre
29f0: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c  e==p ){.      pL
2a00: 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20  ock = pIter;.   
2a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2a20: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2a30: 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69   above search di
2a40: 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c  d not find a BtL
2a50: 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63  ock struct assoc
2a60: 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20  iating Btree p. 
2a70: 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69   ** with table i
2a80: 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20  Table, allocate 
2a90: 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20  one and link it 
2aa0: 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20  into the list.. 
2ab0: 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b   */.  if( !pLock
2ac0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20   ){.    pLock = 
2ad0: 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65  (BtLock *)sqlite
2ae0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
2af0: 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20  of(BtLock));.   
2b00: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2b10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2b30: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
2b40: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
2b50: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
2b60: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
2b70: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
2b80: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
2b90: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
2ba0: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
2bb0: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
2bc0: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
2bd0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2be0: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
2bf0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2c00: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
2c10: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
2c20: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
2c30: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
2c40: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
2c50: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
2c60: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
2c70: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
2c80: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
2c90: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
2ca0: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
2cb0: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
2cc0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
2cd0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
2ce0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2cf0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2d00: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2d10: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2d20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2d30: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
2d40: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
2d50: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
2d60: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
2d70: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
2d80: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2d90: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
2da0: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
2db0: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
2dc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
2dd0: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
2de0: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
2df0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
2e00: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
2e10: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
2e20: 68 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64  hen the BtShared
2e30: 2e 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61  .isPending varia
2e40: 62 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  ble.** may be in
2e50: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
2e60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2e70: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
2e80: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
2e90: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
2ea0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2eb0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
2ec0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
2ed0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
2ee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2ef0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2f00: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2f10: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
2f20: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
2f30: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
2f40: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
2f50: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
2f60: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
2f70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
2f80: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
2f90: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
2fa0: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
2fb0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2fc0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e  Lock->pBtree->in
2fd0: 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c  Trans>=pLock->eL
2fe0: 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ock );.    if( p
2ff0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3000: 29 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72  ){.      *ppIter
3010: 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b   = pLock->pNext;
3020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3030: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3040: 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f  || pLock==&p->lo
3050: 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
3060: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31  pLock->iTable!=1
3070: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3080: 74 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b  te3_free(pLock);
3090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
30a0: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
30b0: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
30c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
30d0: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65  ssert( pBt->isPe
30e0: 6e 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d  nding==0 || pBt-
30f0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66  >pWriter );.  if
3100: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3110: 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57  p ){.    pBt->pW
3120: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3130: 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
3140: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73  = 0;.    pBt->is
3150: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d  Pending = 0;.  }
3160: 65 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54  else if( pBt->nT
3170: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b  ransaction==2 ){
3180: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  .    /* This fun
3190: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31a0: 77 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20  when Btree p is 
31b0: 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a  concluding its .
31c0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
31d0: 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72  on. If there cur
31e0: 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20  rently exists a 
31f0: 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73  writer, and p is
3200: 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   not.    ** that
3210: 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68   writer, then th
3220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  e number of lock
3230: 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
3240: 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20  tions other.    
3250: 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74  ** than the writ
3260: 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74  er must be about
3270: 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f   to drop to zero
3280: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20  . In this case. 
3290: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 69 73     ** set the is
32a0: 50 65 6e 64 69 6e 67 20 66 6c 61 67 20 74 6f 20  Pending flag to 
32b0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
32c0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
32d0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
32e0: 74 65 72 2c 20 74 68 65 6e 20 42 74 53 68 61 72  ter, then BtShar
32f0: 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d 75 73  ed.isPending mus
3300: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
3310: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3320: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3330: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3340: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3350: 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20   pBt->isPending 
3360: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
3370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3380: 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69 74  changes all writ
3390: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  e-locks held by 
33a0: 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65 61  Btree p into rea
33b0: 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  d-locks..*/.stat
33c0: 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64  ic void downgrad
33d0: 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
33e0: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
33f0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
3400: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
3410: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3420: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f  r==p ){.    BtLo
3430: 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  ck *pLock;.    p
3440: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3450: 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c  .    pBt->isExcl
3460: 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70  usive = 0;.    p
3470: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
3480: 30 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b  0;.    for(pLock
3490: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  =pBt->pLock; pLo
34a0: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
34b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
34c0: 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c  ssert( pLock->eL
34d0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
34e0: 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  | pLock->pBtree=
34f0: 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63  =p );.      pLoc
3500: 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  k->eLock = READ_
3510: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
3520: 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
3530: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3540: 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63  CACHE */..static
3550: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
3560: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
3570: 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72  );  /* Forward r
3580: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a  eference */../*.
3590: 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  ***** This routi
35a0: 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  ne is used insid
35b0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e  e of assert() on
35c0: 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65  ly ****.**.** Ve
35d0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75  rify that the cu
35e0: 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d  rsor holds the m
35f0: 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68  utex on its BtSh
3600: 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ared.*/.#ifdef S
3610: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
3620: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
3630: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
3640: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
3650: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
3660: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
3670: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
3680: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3690: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
36a0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
36b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
36c0: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
36d0: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
36e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36f0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3700: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
3710: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
3720: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
3730: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
3740: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
3750: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
3760: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
3770: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
3780: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3790: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
37a0: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
37b0: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
37c0: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
37d0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
37e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
37f0: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
3800: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
3810: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
3820: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
3830: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3840: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
3850: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
3860: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
3870: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
3880: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
3890: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
38a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
38c0: 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  ed before modify
38d0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
38e0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74   of a table.** t
38f0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  o invalidate any
3900: 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72   incrblob cursor
3910: 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  s that are open 
3920: 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72  on the.** row or
3930: 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73   one of the rows
3940: 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e   being modified.
3950: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
3960: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3970: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
3980: 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
3990: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s of the.** tabl
39a0: 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  e is about to be
39b0: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
39c0: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
39d0: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a  e all incrblob.*
39e0: 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  * cursors open o
39f0: 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e  n any row within
3a00: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
3a10: 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f  root-page pgnoRo
3a20: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ot..**.** Otherw
3a30: 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74  ise, if argument
3a40: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3a50: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65   false, then the
3a60: 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77   row with.** row
3a70: 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67  id iRow is being
3a80: 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c   replaced or del
3a90: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
3aa0: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a  se invalidate.**
3ab0: 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72   only those incr
3ac0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
3ad0: 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66  n on that specif
3ae0: 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  ic row..*/.stati
3af0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3b00: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3b10: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
3b20: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
3b30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3b40: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
3b50: 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20  64 iRow,        
3b60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
3b70: 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
3b80: 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20  e changing */.  
3b90: 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  int isClearTable
3ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3bb0: 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
3bc0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
3bd0: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
3be0: 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
3bf0: 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
3c00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c10: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3c20: 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
3c30: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3c40: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3c50: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  t){.    if( p->i
3c60: 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
3c70: 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65  && (isClearTable
3c80: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
3c90: 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20  ==iRow) ){.     
3ca0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
3cb0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
3cc0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
3cd0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
3ce0: 6f 6e 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ons when INCRBLO
3cf0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
3d00: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3d10: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3d20: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
3d30: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3d40: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
3d50: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
3d60: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3d70: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
3d80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
3d90: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
3da0: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
3db0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
3dc0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
3dd0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
3de0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
3df0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
3e00: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
3e10: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
3e20: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
3e30: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
3e40: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
3e50: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
3e60: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
3e70: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
3e80: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
3e90: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
3ea0: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
3eb0: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
3ec0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
3ed0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
3ee0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
3ef0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
3f00: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
3f10: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
3f20: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
3f30: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3f40: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
3f50: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
3f60: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3f70: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
3f80: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
3f90: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
3fa0: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
3fb0: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
3fc0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
3fd0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
3fe0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
3ff0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
4000: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
4010: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
4020: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
4030: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4040: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
4050: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4060: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4070: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4080: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4090: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
40a0: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
40b0: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
40c0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
40d0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
40e0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
40f0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
4100: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
4110: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
4120: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
4130: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
4140: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
4150: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4160: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4170: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4180: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4190: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
41a0: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
41b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
41c0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
41d0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
41e0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
41f0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
4200: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4210: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4220: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4230: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4240: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4250: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4260: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4270: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4280: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4290: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
42a0: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
42b0: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
42c0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
42d0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
42e0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
42f0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
4300: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
4310: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4320: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4330: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4340: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4350: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4360: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4370: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4380: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4390: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
43a0: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
43b0: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
43c0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
43d0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
43e0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
43f0: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
4400: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4410: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4420: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4430: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4440: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4450: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4460: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4470: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4480: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4490: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
44a0: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
44b0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
44c0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
44d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
44e0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
44f0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
4500: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
4510: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4520: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4530: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4540: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4550: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4560: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4570: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4580: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4590: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
45a0: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
45b0: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
45c0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
45d0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
45e0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
45f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
4600: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
4610: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4620: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
4630: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4640: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
4650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4660: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
4670: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4680: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
4690: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
46a0: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
46b0: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
46c0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
46d0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
46e0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
46f0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
4700: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
4710: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
4720: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
4730: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
4740: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4750: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
4760: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
4770: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
4780: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
4790: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
47a0: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
47b0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
47c0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
47d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
47e0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
47f0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4800: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
4810: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
4820: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
4830: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
4840: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
4850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4860: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
4870: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4880: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
4890: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
48a0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
48b0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
48c0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
48d0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
48e0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
48f0: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4900: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4910: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4920: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4930: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4940: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4950: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4960: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4970: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4980: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4990: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
49a0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
49b0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
49c0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
49d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
49e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
49f0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
4a00: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
4a10: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
4a20: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
4a30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
4a40: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
4a50: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
4a60: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
4a70: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
4a80: 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
4a90: 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29  ur, &pCur->nKey)
4aa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
4ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a  SQLITE_OK );  /*
4ac0: 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f   KeySize() canno
4ad0: 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  t fail */..  /* 
4ae0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
4af0: 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  tKey table, then
4b00: 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20   the above call 
4b10: 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28  to BtreeKeySize(
4b20: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
4b30: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e  e integer key in
4b40: 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20   pCur->nKey. In 
4b50: 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76  this case this v
4b60: 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c  alue is.  ** all
4b70: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
4b80: 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
4b90: 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65   pCur is not ope
4ba0: 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20  n on an intKey. 
4bb0: 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20   ** table, then 
4bc0: 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72  malloc space for
4bd0: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70   and store the p
4be0: 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20  Cur->nKey bytes 
4bf0: 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74  of key .  ** dat
4c00: 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  a..  */.  if( 0=
4c10: 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
4c20: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
4c30: 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c  void *pKey = sql
4c40: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74  ite3Malloc( (int
4c50: 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20  )pCur->nKey );. 
4c60: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
4c70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4c80: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
4c90: 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  0, (int)pCur->nK
4ca0: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
4cb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4cc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
4cd0: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
4ce0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
4d00: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
4d10: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4d20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4d30: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
4d40: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
4d50: 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
4d60: 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65  ey || !pCur->pKe
4d70: 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  y );..  if( rc==
4d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4d90: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
4da0: 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
4db0: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
4dc0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
4dd0: 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
4de0: 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67       pCur->apPag
4df0: 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
4e00: 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
4e10: 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e  = -1;.    pCur->
4e20: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
4e30: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
4e40: 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ..  invalidateOv
4e50: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
4e60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
4e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
4e80: 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61  e positions of a
4e90: 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65  ll cursors (exce
4ea0: 70 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74  pt pExcept) that
4eb0: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20   are open on.** 
4ec0: 74 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20  the table  with 
4ed0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
4ee0: 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
4ef0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
4f00: 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70  fore cursor.** p
4f10: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
4f20: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62  o modify the tab
4f30: 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28  le (BtreeDelete(
4f40: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
4f50: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
4f60: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
4f70: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
4f80: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
4f90: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
4fa0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
4fb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4fc0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
4fd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
4fe0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
4ff0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
5000: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
5010: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5020: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5030: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
5040: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5050: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5060: 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20  Root) && .      
5070: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52    p->eState==CUR
5080: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
5090: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
50a0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
50b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
50c0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
50d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
50e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
50f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
5100: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5110: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
5120: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5130: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5140: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
5150: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
5160: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
5170: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5180: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
5190: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
51a0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
51b0: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
51c0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
51d0: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
51e0: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
51f0: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
5200: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
5210: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
5220: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
5230: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
5240: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
5250: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
5260: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
5270: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
5280: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
5290: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
52a0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
52b0: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
52c0: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
52d0: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
52e0: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
52f0: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
5300: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
5310: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
5320: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
5330: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
5340: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
5350: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
5360: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
5370: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
5380: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
5390: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
53a0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
53b0: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
53c0: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
53d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
53e0: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
53f0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
5400: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
5410: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
5420: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
5430: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
5440: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
5450: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
5460: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 31 35    char aSpace[15
5470: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
5480: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
5490: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
54a0: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20  d a malloc */.. 
54b0: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
54c0: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28   assert( nKey==(
54d0: 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b  i64)(int)nKey );
54e0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73  .    pIdxKey = s
54f0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
5500: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
5510: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
5520: 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  , pKey,.        
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
5550: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
5560: 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ace));.    if( p
5570: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5580: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5590: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
55a0: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
55b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
55c0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
55d0: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
55e0: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
55f0: 29 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  );.  if( pKey ){
5600: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5610: 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
5620: 63 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20  cord(pIdxKey);. 
5630: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5640: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
5650: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
5660: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
5670: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
5680: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
5690: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
56a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
56b0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
56c0: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
56d0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
56e0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
56f0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
5700: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5710: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
5720: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
5730: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
5740: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5750: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
5760: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
5770: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
5780: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
5790: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
57a0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
57b0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
57c0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
57d0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
57e0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
57f0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
5800: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5810: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
5820: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5830: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
5840: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
5850: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
5860: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5870: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
5880: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
5890: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
58a0: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
58b0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20  ur->skipNext);. 
58c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
58d0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
58e0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
58f0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
5900: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
5910: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
5920: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
5930: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
5940: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
5950: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5960: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
5970: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5980: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
5990: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
59a0: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
59b0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
59c0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
59d0: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
59e0: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
59f0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
5a00: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
5a10: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
5a20: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
5a30: 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  n it.** was last
5a40: 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72   placed at.  Cur
5a50: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
5a60: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
5a70: 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  are pointing.** 
5a80: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
5a90: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
5aa0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  m..**.** This ro
5ab0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e  utine returns an
5ac0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73   error code if s
5ad0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5ae0: 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74  ong.  The.** int
5af0: 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20  eger *pHasMoved 
5b00: 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66  is set to one if
5b10: 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
5b20: 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e  moved and 0 if n
5b30: 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
5b40: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
5b50: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
5b60: 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d  pCur, int *pHasM
5b70: 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
5b80: 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ..  rc = restore
5b90: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5ba0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
5bb0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5bc0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
5bd0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
5be0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
5bf0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5c00: 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29  r->skipNext!=0 )
5c10: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5c20: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
5c30: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5c40: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5c50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
5c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5c70: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
5c80: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
5c90: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
5ca0: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
5cb0: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
5cc0: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
5cd0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
5ce0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
5cf0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
5d00: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
5d10: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73  age number..*/.s
5d20: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5d30: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5d40: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5d50: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5d60: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5d70: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
5d80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5da0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50  ->mutex) );.  nP
5db0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
5dc0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
5dd0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
5de0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
5df0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
5e00: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
5e10: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
5e20: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
5e30: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
5e40: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
5e50: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
5e60: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
5e70: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
5e80: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
5e90: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
5ea0: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
5eb0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
5ec0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
5ed0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
5ee0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
5ef0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
5f00: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
5f10: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
5f20: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
5f30: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
5f40: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
5f50: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
5f60: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
5f70: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
5f80: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
5f90: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
5fa0: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
5fb0: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
5fc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
5fd0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
5fe0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
5ff0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6000: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
6010: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
6020: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
6030: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
6040: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
6050: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
6060: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
6070: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
6080: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
6090: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
60a0: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
60b0: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
60c0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
60d0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
60e0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
60f0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
6100: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
6110: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
6120: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
6130: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6140: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
6150: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
6160: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
6170: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
6180: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
6190: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
61a0: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
61b0: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
61c0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
61d0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
61e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
61f0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
6200: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
6210: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
6220: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6230: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6240: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
6250: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
6260: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
6270: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
6280: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
6290: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
62a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
62b0: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
62c0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
62d0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
62e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
62f0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6300: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
6310: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
6320: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6330: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
6340: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72  exit;.  }.  pPtr
6350: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6360: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6370: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6380: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6390: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
63a0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
63b0: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
63c0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
63d0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
63e0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
63f0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
6400: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
6410: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6420: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6430: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6440: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6450: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6460: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6470: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6480: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6490: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
64a0: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
64b0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
64c0: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
64d0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
64e0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
64f0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6500: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
6510: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6520: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6530: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6540: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6550: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6560: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6570: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6580: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6590: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
65a0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
65b0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
65c0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
65d0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
65e0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
65f0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6600: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
6610: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6620: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6630: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6640: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6650: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6660: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6670: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6680: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6690: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
66a0: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
66b0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
66c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
66d0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
66e0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
66f0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6700: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6710: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6720: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6730: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6740: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
6750: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
6760: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
6770: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
6780: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
6790: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
67a0: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
67b0: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
67c0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
67d0: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
67e0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
67f0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6800: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
6810: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
6820: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6830: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
6840: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
6850: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6860: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
6870: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
6880: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
6890: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
68a0: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
68b0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
68c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
68d0: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
68e0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
68f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6900: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
6910: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
6920: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
6930: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
6940: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
6950: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
6960: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
6970: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
6980: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
6990: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
69a0: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
69b0: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
69c0: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
69d0: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
69e0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
69f0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
6a00: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
6a10: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
6a20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
6a30: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
6a40: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
6a50: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
6a60: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
6a70: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
6a80: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
6a90: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
6aa0: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
6ab0: 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65  )->aData[(P)->ce
6ac0: 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29  llOffset+2*(I)])
6ad0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ))../*.** This a
6ae0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
6af0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
6b00: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
6b10: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
6b20: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
6b30: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
6b40: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
6b50: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
6b60: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
6b70: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
6b80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6b90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6ba0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6bb0: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
6bc0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
6bd0: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
6be0: 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74  nt k;.    struct
6bf0: 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66   _OvflCell *pOvf
6c00: 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26  l;.    pOvfl = &
6c10: 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b  pPage->aOvfl[i];
6c20: 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e  .    k = pOvfl->
6c30: 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d  idx;.    if( k<=
6c40: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  iCell ){.      i
6c50: 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k==iCell ){. 
6c60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f         return pO
6c70: 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20  vfl->pCell;.    
6c80: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
6c90: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
6ca0: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
6cb0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
6cc0: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
6cd0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
6ce0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
6cf0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
6d00: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
6d10: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
6d20: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
6d30: 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65  n.  btreeParseCe
6d40: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
6d50: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
6d60: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6d70: 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73  nt and btreePars
6d80: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
6d90: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
6da0: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
6db0: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
6dc0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
6dd0: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
6de0: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
6df0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
6e00: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
6e10: 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61  ad of.** btreePa
6e20: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
6e30: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
6e40: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
6e50: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   faster..*/.stat
6e60: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
6e70: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
6e80: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
6e90: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
6ea0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
6eb0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ed0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
6ee0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
6ef0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
6f00: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6f10: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
6f20: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
6f50: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
6f60: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
6f70: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
6f80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6f90: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
6fa0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
6fb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6fc0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6fd0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6fe0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
6ff0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
7000: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
7010: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
7020: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
7030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7040: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
7050: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
7060: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7070: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
7080: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7090: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
70a0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
70b0: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
70c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
70d0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
70e0: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
70f0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
7100: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
7110: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
7120: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
7130: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
7140: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
7150: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
7160: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
7170: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
7180: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
7190: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
71a0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
71b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
71c0: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
71d0: 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  n;.  testcase( n
71e0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
71f0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
7200: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7210: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7220: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b  l+1 );.  if( lik
7230: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
7240: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
7250: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
7260: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
7270: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7280: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
7290: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
72a0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
72b0: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
72c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
72d0: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20  .    int nSize; 
72e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
72f0: 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63  l size of cell c
7300: 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20  ontent in bytes 
7310: 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e  */.    nSize = n
7320: 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20  Payload + n;.   
7330: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7340: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
7350: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
7360: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66  flow = 0;.    if
7370: 28 20 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d  ( (nSize & ~3)==
7380: 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  0 ){.      nSize
7390: 20 3d 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 4;        /* 
73a0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
73b0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a  e is 4 */.    }.
73c0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
73d0: 20 3d 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20   = (u16)nSize;. 
73e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
73f0: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
7400: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
7410: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
7420: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
7430: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
7440: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
7450: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
7460: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
7470: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
7480: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
7490: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
74a0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
74b0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
74c0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
74d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
74e0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
74f0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
7500: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
7510: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
7520: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
7530: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7540: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
7550: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
7560: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
7570: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
7580: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
7590: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
75a0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
75b0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
75c0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
75d0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
75e0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
75f0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7600: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
7610: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
7620: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7630: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7640: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
7650: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
7660: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
7670: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
7680: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
7690: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
76a0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
76b0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
76c0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
76d0: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
76e0: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
76f0: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
7700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7710: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
7720: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7730: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7740: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
7750: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7760: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
7770: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7780: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7790: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
77a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
77b0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
77c0: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
77d0: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
77e0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
77f0: 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  )(pInfo->nLocal 
7800: 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  + n);.    pInfo-
7810: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
7820: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
7830: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
7840: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
7850: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
7860: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7870: 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43  r((pPage), findC
7880: 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43  ell((pPage), (iC
7890: 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a  ell)), (pInfo)).
78a0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
78b0: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
78c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
78d0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
78e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
78f0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
7900: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7910: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
7920: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
7930: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
7940: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7950: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7960: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7970: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
7980: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
79a0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
79b0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
79c0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
79d0: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
79e0: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
79f0: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
7a00: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
7a10: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
7a20: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
7a30: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
7a40: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
7a50: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
7a60: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
7a70: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
7a80: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
7a90: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7aa0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
7ab0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
7ac0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70    u8 *pIter = &p
7ad0: 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c  Cell[pPage->chil
7ae0: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32  dPtrSize];.  u32
7af0: 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20   nSize;..#ifdef 
7b00: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
7b10: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7b20: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7b30: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
7b40: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
7b50: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
7b60: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
7b70: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
7b80: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
7b90: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
7ba0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
7bb0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
7bc0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
7bd0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
7be0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
7bf0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
7c00: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
7c10: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
7c20: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
7c30: 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  fo;.  btreeParse
7c40: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7c50: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
7c60: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
7c70: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7c80: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a  {.    u8 *pEnd;.
7c90: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7ca0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7cb0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
7cc0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
7cd0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
7ce0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a       nSize = 0;.
7cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49      }..    /* pI
7d00: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
7d10: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
7d20: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
7d30: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
7d40: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
7d50: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
7d60: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
7d70: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
7d80: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
7d90: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
7da0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
7db0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
7dc0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
7dd0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
7de0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
7df0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  <pEnd );.  }else
7e00: 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  {.    pIter += g
7e10: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
7e20: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , nSize);.  }.. 
7e30: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
7e40: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7e50: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
7e60: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
7e70: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
7e80: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
7e90: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
7ea0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
7eb0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7ec0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
7ed0: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
7ee0: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
7ef0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7f00: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
7f10: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
7f20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7f30: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7f40: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
7f50: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7f60: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
7f70: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
7f80: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
7f90: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
7fa0: 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  Size += 4;.  }. 
7fb0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
7fc0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
7fd0: 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75  .  /* The minimu
7fe0: 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65  m size of any ce
7ff0: 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a  ll is 4 bytes. *
8000: 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20  /.  if( nSize<4 
8010: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  ){.    nSize = 4
8020: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
8030: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
8040: 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74  o.nSize );.  ret
8050: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
8060: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8070: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
8080: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
8090: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
80a0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
80b0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
80c0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
80d0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
80e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
80f0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
8100: 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  turn cellSizePtr
8110: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
8120: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
8130: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
8140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8150: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
8160: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
8170: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
8180: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
8190: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
81a0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
81b0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
81c0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
81d0: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
81e0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
81f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8200: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
8210: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8220: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
8230: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
8240: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
8250: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
8260: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
8270: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8280: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8290: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
82a0: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
82b0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
82c0: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
82d0: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
82e0: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
82f0: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
8300: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
8310: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
8320: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70  verflow]);.    p
8330: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
8340: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
8350: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
8360: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
8370: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
8380: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
8390: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
83a0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
83b0: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
83c0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
83d0: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
83e0: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
83f0: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8400: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8410: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8420: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
8430: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
8440: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
8450: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
8460: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
8470: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
8480: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
8490: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
84a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
84b0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
84c0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
84d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
84e0: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
84f0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8520: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
8530: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
8560: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
8570: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
8580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
8590: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
85a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
85b0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
85c0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
85d0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
85e0: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
85f0: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8610: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8620: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
8630: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8650: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
8660: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
8670: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8680: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
8690: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
86a0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
86b0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
86c0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
86d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
86e0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8700: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8710: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8720: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
8730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
8740: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
8750: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
8760: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8770: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8780: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8790: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
87a0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
87b0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
87c0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
87d0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
87e0: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
87f0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8800: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8810: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8820: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8830: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
8840: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
8850: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
8860: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
8870: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
8880: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8890: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
88a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
88b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
88c0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
88d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
88e0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
88f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8900: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8910: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8920: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
8930: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
8940: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
8950: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
8960: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
8970: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
8980: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8990: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
89a0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
89b0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
89c0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
89d0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
89e0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
89f0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8a00: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8a10: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8a20: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
8a30: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
8a40: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
8a50: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
8a60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a70: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
8a80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8a90: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8aa0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8ab0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8ac0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8ad0: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8ae0: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8af0: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8b00: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8b10: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8b20: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8b30: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
8b40: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
8b50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8b60: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
8b70: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
8b80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8b90: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8ba0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8bb0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8bc0: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8bd0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8be0: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8bf0: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8c00: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8c10: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8c20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8c30: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8c40: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
8c50: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8c60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8c70: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8c80: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8c90: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8ca0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8cb0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8cc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8ce0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
8cf0: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
8d00: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
8d10: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
8d20: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8d30: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
8d40: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
8d50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8d60: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
8d70: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
8d80: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
8d90: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
8da0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
8db0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
8dc0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
8dd0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
8de0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
8df0: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
8e00: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
8e10: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
8e20: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
8e30: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
8e40: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
8e50: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
8e60: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
8e70: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8e80: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8e90: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
8ea0: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
8eb0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
8ec0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8ed0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8ee0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
8ef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8f00: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
8f10: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
8f20: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
8f30: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
8f40: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
8f50: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
8f60: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
8f70: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
8f80: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
8f90: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
8fa0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
8fb0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
8fc0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
8fd0: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
8fe0: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
8ff0: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
9000: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
9010: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
9020: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
9030: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
9040: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
9050: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
9060: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
9070: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
9080: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
9090: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
90a0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
90b0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
90c0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
90d0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
90e0: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
90f0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
9100: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
9110: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
9120: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
9130: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
9140: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
9150: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
9160: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
9170: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
9180: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
9190: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
91a0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
91b0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
91c0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
91d0: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
91e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
91f0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
9200: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
9210: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
9220: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
9230: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
9240: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
9250: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
9260: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9290: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
92a0: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
92b0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
92e0: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
92f0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9300: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9310: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9320: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
9330: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
9340: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
9350: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9360: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
9370: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
9380: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  nt usableSize; /
9390: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
93a0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a   the page */.  .
93b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
93c0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
93d0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
93e0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
93f0: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9400: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9410: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9420: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9430: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9440: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9450: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9460: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
9470: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
9480: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
9490: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
94a0: 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  =0 );.  usableSi
94b0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
94c0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61  >usableSize;.  a
94d0: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75  ssert( nByte < u
94e0: 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a  sableSize-8 );..
94f0: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9500: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9510: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9520: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9530: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9540: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
9550: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
9560: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
9570: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9580: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9590: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
95a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
95b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
95c0: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
95d0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
95e0: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
95f0: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
9600: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
9610: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
9620: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
9630: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
9640: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
9650: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9660: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9670: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9680: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9690: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
96a0: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
96b0: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
96c0: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
96d0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
96e0: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
96f0: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9700: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9710: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9720: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9730: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
9740: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
9750: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
9760: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
9770: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
9780: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
9790: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
97a0: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
97b0: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
97c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
97d0: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
97e0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
97f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9800: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
9810: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69   slot */.      i
9820: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
9830: 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20  -4 || pc<addr+4 
9840: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9850: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9860: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
9870: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
9880: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
9890: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
98a0: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
98b0: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
98c0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
98d0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
98e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
98f0: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
9900: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
9910: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
9920: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
9930: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
9940: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9950: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9960: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9970: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9980: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9990: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
99a0: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
99b0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
99c0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
99d0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
99e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
99f0: 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c   size+pc > usabl
9a00: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
9a10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9a20: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9a30: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9a40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9a50: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
9a60: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9a70: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9a80: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9a90: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9aa0: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9ab0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9ac0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9ad0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9ae0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9af0: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9b00: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
9b10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9b20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9b30: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
9b40: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
9b50: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
9b60: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
9b70: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
9b80: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
9b90: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
9ba0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
9bb0: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
9bc0: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
9bd0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
9be0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
9bf0: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
9c00: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
9c10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9c20: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
9c30: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9c40: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
9c50: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
9c60: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
9c70: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
9c80: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
9c90: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
9ca0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
9cb0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
9cc0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
9cd0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
9ce0: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
9cf0: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
9d00: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
9d10: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
9d20: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
9d30: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
9d40: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
9d50: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
9d60: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
9d70: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
9d80: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
9d90: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
9da0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
9db0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
9dc0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
9dd0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
9de0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
9df0: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67  op+nByte <= pPag
9e00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9e10: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
9e20: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
9e30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9e40: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
9e50: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
9e60: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
9e70: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
9e80: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
9e90: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
9ea0: 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b  is pPage->aDisk[
9eb0: 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  start].** and th
9ec0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
9ed0: 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79  ock is "size" by
9ee0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  tes..**.** Most 
9ef0: 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65  of the effort he
9f00: 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  re is involved i
9f10: 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61  n coalesing adja
9f20: 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f  cent.** free blo
9f30: 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  cks into a singl
9f40: 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b  e big free block
9f50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9f60: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
9f70: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
9f80: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
9f90: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
9fa0: 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69  in, hdr;.  int i
9fb0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9fd0: 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  Largest possible
9fe0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
9ff0: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
a000: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
a010: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
a020: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a030: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a040: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a050: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a060: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
a070: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
a080: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
a090: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a0a0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
a0b0: 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c   (start + size)<
a0c0: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
a0d0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
a0e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a0f0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a100: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a110: 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20  assert( size>=0 
a120: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
a130: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
a140: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  /..  if( pPage->
a150: 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
a160: 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  e ){.    /* Over
a170: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
a180: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
a190: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
a1a0: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20  cure_delete.    
a1b0: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
a1c0: 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  bled */.    mems
a1d0: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
a1e0: 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a   0, size);.  }..
a1f0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
a200: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
a210: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
a220: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74  freeblocks.  Not
a230: 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e  e that.  ** even
a240: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
a250: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
a260: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
a270: 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20  nitPage(),.  ** 
a280: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
a290: 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  did not detect o
a2a0: 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73  verlapping cells
a2b0: 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f   or.  ** freeblo
a2c0: 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70  cks that overlap
a2d0: 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72  ped cells.   Nor
a2e0: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
a2f0: 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65  when the.  ** ce
a300: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
a310: 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75  exceeds the valu
a320: 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  e in the page he
a330: 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a  ader.  If these.
a340: 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20    ** situations 
a350: 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73  arise, then subs
a360: 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70  equent insert op
a370: 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63  erations might c
a380: 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20  orrupt.  ** the 
a390: 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65  freelist.  So we
a3a0: 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   do need to chec
a3b0: 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e  k for corruption
a3c0: 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a   while scanning.
a3d0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a3e0: 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  t..  */.  hdr = 
a3f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
a400: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
a410: 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50   1;.  iLast = pP
a420: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a430: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65  Size - 4;.  asse
a440: 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74  rt( start<=iLast
a450: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   );.  while( (pb
a460: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
a470: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
a480: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
a490: 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  ){.    if( pbegi
a4a0: 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  n<addr+4 ){.    
a4b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a4d0: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70    }.    addr = p
a4e0: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  begin;.  }.  if(
a4f0: 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b   pbegin>iLast ){
a500: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a510: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
a530: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
a540: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
a550: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
a560: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
a570: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a580: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
a590: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
a5a0: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
a5b0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
a5c0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28  pPage->nFree + (
a5d0: 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  u16)size;..  /* 
a5e0: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
a5f0: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
a600: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
a610: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
a620: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a630: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
a640: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
a650: 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61   psize, x;.    a
a660: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
a670: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
a680: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
a690: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a6a0: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
a6b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a6c0: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
a6d0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a6e0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
a6f0: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
a700: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
a710: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
a720: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
a730: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
a740: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
a750: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
a760: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
a770: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
a780: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a790: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7b0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
a7c0: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
a7d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a7e0: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
a7f0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a800: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
a810: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
a820: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a830: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
a840: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
a850: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
a860: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
a870: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
a880: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
a890: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
a8a0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
a8b0: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
a8c0: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
a8d0: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
a8e0: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
a8f0: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
a900: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
a910: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
a920: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
a930: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
a940: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
a950: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
a960: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
a970: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a980: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a990: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
a9a0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a9b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a9c0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a9d0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
a9e0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a9f0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
aa00: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
aa10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
aa20: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
aa30: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
aa40: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
aa50: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aa60: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
aa70: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
aa80: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
aa90: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
aaa0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
aab0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
aac0: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
aad0: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
aae0: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
aaf0: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
ab00: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
ab10: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
ab20: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
ab30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ab40: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
ab50: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
ab60: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
ab70: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
ab80: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
ab90: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
aba0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
abb0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
abc0: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
abd0: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
abe0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
abf0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
ac00: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
ac10: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
ac20: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
ac30: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
ac40: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
ac50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ac60: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ac70: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ac80: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
ac90: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
aca0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
acb0: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
acc0: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
acd0: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
ace0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
acf0: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
ad00: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
ad10: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
ad20: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
ad30: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
ad40: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
ad50: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
ad60: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
ad70: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
ad80: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
ad90: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
ada0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
adb0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
adc0: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
add0: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
ade0: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
adf0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
ae00: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
ae10: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
ae20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
ae30: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
ae40: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
ae50: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
ae60: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
ae70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ae80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ae90: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
aea0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
aeb0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
aec0: 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
aed0: 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
aee0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
aef0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
af00: 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
af10: 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
af20: 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
af30: 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
af40: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
af50: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
af60: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
af70: 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
af80: 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
af90: 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
afa0: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
afb0: 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
afc0: 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
afd0: 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
afe0: 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
aff0: 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
b000: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b010: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d   btreeInitPage(M
b020: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
b030: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b040: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b050: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b060: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b070: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b080: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b090: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
b0a0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
b0b0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b0c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
b0d0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b0e0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
b0f0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b100: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
b110: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
b120: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
b130: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
b140: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
b150: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
b160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b170: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
b180: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
b190: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
b1a0: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
b1b0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b1c0: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
b1d0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
b1e0: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
b1f0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
b200: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
b210: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
b220: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
b230: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
b240: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75  ructure */.    u
b250: 31 36 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  16 usableSize;  
b260: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
b270: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
b280: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
b290: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
b2a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
b2b0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
b2c0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
b2d0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36  inter */.    u16
b2e0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
b2f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
b300: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
b310: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
b320: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
b330: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
b340: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
b350: 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
b360: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
b370: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
b380: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b390: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b3a0: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
b3b0: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
b3c0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
b3d0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
b3e0: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
b3f0: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
b400: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
b410: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
b420: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
b430: 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46  .    if( decodeF
b440: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
b450: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
b460: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b470: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
b480: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
b490: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
b4a0: 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20  Size<=32768 );. 
b4b0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61     pPage->maskPa
b4c0: 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ge = pBt->pageSi
b4d0: 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67  ze - 1;.    pPag
b4e0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
b4f0: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
b500: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
b510: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
b520: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
b530: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
b540: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
b550: 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  f;.    top = get
b560: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b570: 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  5]);.    pPage->
b580: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
b590: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
b5a0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
b5b0: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
b5c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f  ) ){.      /* To
b5d0: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
b5e0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
b5f0: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
b600: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
b610: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b620: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b630: 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
b640: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
b650: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
b660: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72  .    /* A malfor
b670: 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
b680: 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73  e might cause us
b690: 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68   to read past th
b6a0: 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20  e end.    ** of 
b6b0: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
b6c0: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20  g a cell.  .    
b6d0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  **.    ** The fo
b6e0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
b6f0: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72   code checks ear
b700: 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63  ly to see if a c
b710: 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ell extends.    
b720: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
b730: 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  of a page bounda
b740: 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51  ry and causes SQ
b750: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20  LITE_CORRUPT to 
b760: 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  be .    ** retur
b770: 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a  ned if it does..
b780: 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c      */.    iCell
b790: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
b7a0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
b7b0: 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61  ell;.    iCellLa
b7c0: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
b7d0: 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  - 4;.#if defined
b7e0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
b7f0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
b800: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
b810: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b820: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
b830: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b840: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
b850: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
b860: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
b870: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66  ell */..      if
b880: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
b890: 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
b8a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
b8b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
b8c0: 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20  ){.        pc = 
b8d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
b8e0: 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
b8f0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b900: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
b910: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  t );.        tes
b920: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
b930: 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Last );.        
b940: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b950: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b960: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
b970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b980: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
b990: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
b9a0: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
b9b0: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
b9c0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b9d0: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
b9e0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
b9f0: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
ba00: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
ba10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ba20: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ba30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ba40: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
ba50: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
ba60: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65  st++;.    }  .#e
ba70: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ndif..    /* Com
ba80: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
ba90: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
baa0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20   page */.    pc 
bab0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bac0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
bad0: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
bae0: 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69  ] + top;.    whi
baf0: 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  le( pc>0 ){.    
bb00: 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65    u16 next, size
bb10: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69  ;.      if( pc<i
bb20: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
bb30: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
bb40: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
bb50: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   free block is o
bb60: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
bb70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bb80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bb90: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
bba0: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
bbb0: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
bbc0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
bbd0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
bbe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78  ;.      if( (nex
bbf0: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
bc00: 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69  size+3) || pc+si
bc10: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
bc20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
bc30: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
bc40: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
bc50: 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74  er. And the last
bc60: 20 62 79 74 65 20 6f 66 0a 09 2a 2a 20 74 68 65   byte of..** the
bc70: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
bc80: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
bc90: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
bca0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
bcb0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bcc0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
bcd0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
bce0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
bcf0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
bd00: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
bd10: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
bd20: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
bd30: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
bd40: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
bd50: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
bd60: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
bd70: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
bd80: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
bd90: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
bda0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
bdb0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
bdc0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
bdd0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
bde0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
bdf0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
be00: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
be10: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
be20: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
be30: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
be40: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
be50: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
be60: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
be70: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
be80: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
be90: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
bea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
beb0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
bec0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
bed0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bee0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
bef0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
bf00: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
bf10: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
bf20: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
bf30: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
bf40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
bf50: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
bf60: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
bf70: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
bf80: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
bf90: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
bfa0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
bfb0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
bfc0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
bfd0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
bfe0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
bff0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
c000: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c010: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
c020: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
c030: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
c040: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
c050: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c060: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
c070: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
c080: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
c090: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c0a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
c0b0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
c0c0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
c0d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
c0e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
c0f0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
c100: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c110: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
c120: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
c130: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c140: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c150: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c160: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65  );.  if( pBt->se
c170: 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
c180: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
c190: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
c1a0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
c1b0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
c1c0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
c1d0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
c1e0: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
c1f0: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
c200: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c210: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
c220: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c230: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c240: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
c250: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
c260: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42  Page->nFree = pB
c270: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c280: 66 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46  first;.  decodeF
c290: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
c2a0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  s);.  pPage->hdr
c2b0: 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20  Offset = hdr;.  
c2c0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c2d0: 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61  t = first;.  pPa
c2e0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
c2f0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
c300: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
c310: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
c320: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61  <=32768 );.  pPa
c330: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70  ge->maskPage = p
c340: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
c350: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
c360: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
c370: 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
c380: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
c390: 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
c3a0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
c3b0: 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
c3c0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
c3d0: 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
c3e0: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
c3f0: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
c400: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
c410: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
c420: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
c430: 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
c440: 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
c450: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
c460: 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d  bPage);.  pPage-
c470: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
c480: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
c490: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
c4a0: 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
c4b0: 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20  e;.  pPage->pBt 
c4c0: 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e  = pBt;.  pPage->
c4d0: 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70  pgno = pgno;.  p
c4e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c4f0: 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  = pPage->pgno==1
c500: 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65   ? 100 : 0;.  re
c510: 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a  turn pPage; .}..
c520: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
c530: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
c540: 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65    Initialize the
c550: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
c560: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
c570: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
c580: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  eded..**.** If t
c590: 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61  he noContent fla
c5a0: 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
c5b0: 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
c5c0: 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20  t care about.** 
c5d0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
c5e0: 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
c5f0: 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
c600: 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
c610: 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
c620: 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
c630: 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
c640: 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
c650: 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
c660: 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
c670: 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
c680: 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
c690: 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
c6a0: 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
c6b0: 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
c6c0: 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
c6d0: 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
c6e0: 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
c6f0: 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
c700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c710: 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  btreeGetPage(.  
c720: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
c730: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
c740: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
c750: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c760: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
c770: 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
c780: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
c790: 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
c7a0: 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
c7b0: 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
c7c0: 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
c7d0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f      /* Do not lo
c7e0: 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
c7f0: 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
c800: 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
c810: 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
c820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
c830: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
c840: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
c850: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
c860: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
c870: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
c880: 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  &pDbPage, noCont
c890: 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ent);.  if( rc )
c8a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
c8b0: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
c8c0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
c8d0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
c8e0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c8f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
c900: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
c910: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
c920: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
c930: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
c940: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
c950: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
c960: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
c970: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c980: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c990: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c9a0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c9b0: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
c9c0: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
c9d0: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
c9e0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
c9f0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
ca00: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ca10: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ca20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
ca30: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
ca40: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
ca50: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
ca60: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
ca70: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
ca80: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
ca90: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
caa0: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
cab0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
cac0: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
cad0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cae0: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
caf0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
cb00: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
cb10: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
cb20: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
cb30: 74 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61  tic Pgno pagerPa
cb40: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
cb50: 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50   *pBt){.  int nP
cb60: 61 67 65 20 3d 20 28 69 6e 74 29 70 42 74 2d 3e  age = (int)pBt->
cb70: 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
cb80: 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
cb90: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
cba0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
cbb0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
cbc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
cbd0: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
cbe0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
cbf0: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
cc00: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
cc10: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
cc20: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
cc30: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
cc40: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
cc50: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
cc60: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
cc70: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
cc80: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
cc90: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
cca0: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
ccb0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
ccc0: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
ccd0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
cce0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
ccf0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
cd00: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
cd10: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
cd20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
cd30: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
cd40: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
cd50: 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e     /* Write t
cd60: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
cd70: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
cd80: 20 72 63 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28   rc;.  TESTONLY(
cd90: 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 20 3d 20   Pgno iLastPg = 
cda0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
cdb0: 42 74 29 3b 20 29 0a 20 20 61 73 73 65 72 74 28  Bt); ).  assert(
cdc0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
cdd0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
cde0: 29 3b 0a 0a 20 20 72 63 20 3d 20 62 74 72 65 65  );..  rc = btree
cdf0: 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
ce00: 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
ce10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ce20: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
ce30: 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
ce40: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
ce50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ce60: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
ce70: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
ce80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
ce90: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
cea0: 65 20 6e 75 6d 62 65 72 20 77 61 73 20 65 69 74  e number was eit
ceb0: 68 65 72 20 30 20 6f 72 20 67 72 65 61 74 65 72  her 0 or greater
cec0: 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 0a 20   than the page. 
ced0: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 74 68   ** number of th
cee0: 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
cef0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  he database, thi
cf00: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
cf10: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  d return.  ** SQ
cf20: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20  LITE_CORRUPT or 
cf30: 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
cf40: 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 46 55   (i.e. SQLITE_FU
cf50: 4c 4c 29 2e 20 43 68 65 63 6b 20 74 68 61 74 20  LL). Check that 
cf60: 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65  this.  ** is the
cf70: 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
cf80: 65 72 74 28 20 28 70 67 6e 6f 3e 30 20 26 26 20  ert( (pgno>0 && 
cf90: 70 67 6e 6f 3c 3d 69 4c 61 73 74 50 67 29 20 7c  pgno<=iLastPg) |
cfa0: 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
cfb0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
cfc0: 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74  gno==0 );.  test
cfd0: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 69 4c 61 73  case( pgno==iLas
cfe0: 74 50 67 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tPg );..  return
cff0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
d000: 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
d010: 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
d020: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
d030: 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
d040: 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
d050: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
d060: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
d070: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
d080: 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
d090: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d0a0: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
d0b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d0c0: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
d0d0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
d0e0: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
d0f0: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
d100: 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73  )pPage );.    as
d110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d120: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
d130: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
d140: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
d150: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d160: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d170: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d180: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
d190: 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62  Unref(pPage->pDb
d1a0: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
d1b0: 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
d1c0: 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
d1d0: 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
d1e0: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
d1f0: 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
d200: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
d210: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
d220: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
d230: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
d240: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
d250: 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
d260: 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
d270: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d280: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
d290: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
d2a0: 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
d2b0: 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
d2c0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
d2d0: 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
d2e0: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
d2f0: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
d300: 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
d310: 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
d320: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
d330: 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
d340: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
d350: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
d360: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
d370: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
d380: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
d390: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
d3a0: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
d3b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d3c0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d3d0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d3e0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
d3f0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
d400: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
d410: 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
d420: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
d430: 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
d440: 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
d450: 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
d460: 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
d470: 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
d480: 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
d490: 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
d4a0: 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
d4b0: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
d4c0: 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
d4d0: 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
d4e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d4f0: 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
d500: 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
d510: 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
d520: 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
d530: 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
d540: 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
d550: 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
d560: 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
d570: 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
d580: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
d590: 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
d5a0: 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
d5b0: 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
d5c0: 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
d5d0: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
d5e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
d5f0: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
d600: 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
d610: 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
d620: 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
d630: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
d640: 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
d650: 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
d660: 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
d670: 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
d680: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d690: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d6a0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
d6b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
d6c0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
d6d0: 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
d6e0: 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
d6f0: 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
d700: 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
d710: 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
d720: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
d730: 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
d740: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
d750: 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ** a new databas
d760: 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20  e with a random 
d770: 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e  name is created.
d780: 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20    This randomly 
d790: 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73  named.** databas
d7a0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
d7b0: 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69  eleted when sqli
d7c0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
d7d0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66  is called..** If
d7e0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
d7f0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
d800: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
d810: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
d820: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
d830: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
d840: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
d850: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
d860: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
d870: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
d880: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
d890: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
d8a0: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
d8b0: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
d8c0: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
d8d0: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
d8e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
d8f0: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
d900: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
d910: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
d920: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
d930: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
d940: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
d950: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
d960: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
d970: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
d980: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
d990: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63  e3BtreeOpen(.  c
d9a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
d9b0: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
d9c0: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
d9d0: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
d9e0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
d9f0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
da00: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
da10: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
da20: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
da30: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
da40: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
da50: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
da60: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
da70: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
da80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
da90: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
daa0: 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
dab0: 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
dac0: 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
dad0: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
dae0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
daf0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
db00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
db10: 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
db20: 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74  is btree */.  Bt
db30: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db50: 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
db60: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
db70: 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db90: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
dba0: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
dbb0: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
dbc0: 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
dbd0: 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
dbe0: 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
dbf0: 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
dc00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
dc10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
dc20: 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
dc30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
dc40: 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
dc70: 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
dc80: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
dc90: 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
dca0: 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
dcb0: 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
dcc0: 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74  ent */..  /* Set
dcd0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
dce0: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
dcf0: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
dd00: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
dd10: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
dd20: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
dd30: 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69  e. This symbol i
dd40: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
dd50: 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f  if.  ** either o
dd60: 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74  f the shared-dat
dd70: 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20  a or autovacuum 
dd80: 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d  features are com
dd90: 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f  piled .  ** into
dda0: 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20   the library..  
ddb0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
ddc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
ddd0: 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65  ED_CACHE) || !de
dde0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ddf0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20  T_AUTOVACUUM).  
de00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
de10: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
de20: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
de30: 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20  b = 0;.  #else. 
de40: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
de50: 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  emdb = zFilename
de60: 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c   && !strcmp(zFil
de70: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
de80: 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e  ");.  #endif.#en
de90: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
dea0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
deb0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
dec0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
ded0: 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d  );..  pVfs = db-
dee0: 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c  >pVfs;.  p = sql
def0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
df00: 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
df10: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
df20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
df30: 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
df40: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
df50: 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
df60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
df70: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
df80: 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
df90: 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
dfa0: 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
dfb0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
dfc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
dfd0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
dfe0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
dff0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
e000: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
e010: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
e020: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
e030: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
e040: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
e050: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
e060: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
e070: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
e080: 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20   if( isMemdb==0 
e090: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  && zFilename && 
e0a0: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
e0b0: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
e0c0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
e0d0: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
e0e0: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
e0f0: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
e100: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
e110: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
e120: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
e130: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
e140: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
e150: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
e160: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d  Shared;.      p-
e170: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
e180: 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
e190: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
e1a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
e1b0: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
e1c0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e1d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
e1e0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
e1f0: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
e200: 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e  name, nFullPathn
e210: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
e220: 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  me);.      mutex
e230: 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
e240: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
e250: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
e260: 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
e270: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
e280: 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
e290: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
e2a0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
e2b0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
e2c0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
e2d0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e2e0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
e2f0: 65 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ed);.      for(p
e300: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
e310: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
e320: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
e330: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
e340: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
e350: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
e360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
e370: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
e380: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
e390: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
e3a0: 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20  >pPager)).      
e3b0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
e3c0: 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
e3d0: 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
e3e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
e3f0: 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
e400: 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
e410: 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
e420: 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
e430: 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
e440: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
e450: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
e460: 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
e470: 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
e480: 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
e490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
e4a0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
e4b0: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
e4c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
e4d0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
e4e0: 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
e4f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e500: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e510: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
e530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
e540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
e550: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
e560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e570: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
e580: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
e590: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
e5a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
e5b0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
e5c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e5d0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
e5e0: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
e5f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
e600: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e610: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
e620: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
e630: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
e640: 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
e650: 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
e660: 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
e670: 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
e680: 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
e690: 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
e6a0: 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
e6b0: 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
e6c0: 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
e6d0: 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
e6e0: 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
e6f0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
e700: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
e710: 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
e720: 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
e730: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
e740: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
e750: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
e760: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
e770: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
e780: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
e790: 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
e7a0: 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
e7b0: 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
e7c0: 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
e7d0: 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
e7e0: 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
e7f0: 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
e800: 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
e810: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
e820: 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
e830: 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
e840: 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
e850: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e860: 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a  f(i64)==8 || siz
e870: 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20  eof(i64)==4 );. 
e880: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e890: 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a  f(u64)==8 || siz
e8a0: 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20  eof(u64)==4 );. 
e8b0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
e8c0: 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u32)==4 );.   
e8d0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e8e0: 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61  u16)==2 );.    a
e8f0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67  ssert( sizeof(Pg
e900: 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20  no)==4 );.  .   
e910: 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61   pBt = sqlite3Ma
e920: 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
e930: 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66  (*pBt) );.    if
e940: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
e950: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
e960: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
e970: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
e980: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
e990: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
e9a0: 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
e9b0: 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53           EXTRA_S
e9e0: 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46  IZE, flags, vfsF
e9f0: 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74  lags, pageReinit
ea00: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
ea10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ea20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ea30: 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
ea40: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
ea50: 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
ea60: 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
ea70: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
ea80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ea90: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
eaa0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
eab0: 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
eac0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
ead0: 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
eae0: 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
eaf0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
eb00: 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
eb10: 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
eb20: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
eb30: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
eb40: 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
eb50: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69  >readOnly = sqli
eb60: 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
eb70: 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ly(pBt->pPager);
eb80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
eb90: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
eba0: 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65   pBt->secureDele
ebb0: 74 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  te = 1;.#endif. 
ebc0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
ebd0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44 62   = get2byte(&zDb
ebe0: 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20  Header[16]);.   
ebf0: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
ec00: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
ec10: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
ec20: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
ec30: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
ec40: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
ec50: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
ec60: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
ec70: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
ec80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
ec90: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
eca0: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
ecb0: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
ecc0: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
ecd0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
ece0: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
ecf0: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
ed00: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
ed10: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
ed20: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
ed30: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
ed40: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
ed50: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
ed60: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
ed70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
ed80: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
ed90: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
eda0: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
edb0: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
edc0: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
edd0: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
ede0: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
edf0: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
ee00: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
ee10: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
ee20: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
ee30: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
ee40: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
ee50: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
ee60: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
ee70: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
ee80: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
ee90: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
eea0: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
eeb0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
eec0: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
eed0: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
eee0: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
eef0: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
ef00: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  0];.      pBt->p
ef10: 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
ef20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ef30: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
ef40: 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
ef50: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
ef60: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
ef70: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
ef80: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
ef90: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
efa0: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
efb0: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
efc0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
efd0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
efe0: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
eff0: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
f000: 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
f010: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
f020: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f030: 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
f040: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
f050: 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
f060: 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
f070: 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
f080: 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
f090: 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
f0a0: 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
f0b0: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
f0c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
f0d0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
f0e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f0f0: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
f100: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
f110: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
f120: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
f130: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
f140: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
f150: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
f160: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
f170: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
f180: 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ed;.      pBt->n
f190: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  Ref = 1;.      m
f1a0: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
f1b0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
f1c0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
f1d0: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
f1e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
f1f0: 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
f200: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
f210: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
f220: 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
f230: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
f240: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
f250: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
f260: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
f270: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
f280: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f290: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
f2a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
f2b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
f2c0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f2d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f2e0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f2f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
f300: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f310: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
f320: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
f330: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
f340: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
f350: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
f360: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
f370: 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
f380: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f390: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
f3a0: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
f3b0: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
f3c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f3d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f3e0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f3f0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f400: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
f410: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
f420: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
f430: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
f440: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
f450: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
f460: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
f470: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
f480: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
f490: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
f4a0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
f4b0: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
f4c0: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
f4d0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
f4e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
f4f0: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
f500: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
f510: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
f520: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
f530: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
f540: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
f550: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
f560: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
f570: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
f580: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
f590: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
f5a0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f5b0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
f5c0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
f5d0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
f5e0: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
f5f0: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
f600: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
f610: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
f620: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
f630: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
f640: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
f650: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
f660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f670: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
f680: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
f690: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
f6a0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
f6b0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
f6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
f6d0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
f6e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f6f0: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
f700: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
f710: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
f720: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f730: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
f740: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
f750: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
f760: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f770: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
f780: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
f790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
f7a0: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
f7b0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
f7c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
f7d0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
f7e0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
f7f0: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
f800: 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
f810: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
f820: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f830: 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
f840: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
f850: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
f860: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
f870: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
f880: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
f890: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
f8a0: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
f8b0: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
f8c0: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
f8d0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
f8e0: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
f8f0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
f900: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
f910: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
f920: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
f930: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
f940: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
f950: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
f960: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
f970: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
f980: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
f990: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f9a0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
f9b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
f9c0: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
f9d0: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
f9e0: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
f9f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fa00: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
fa10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
fa20: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
fa30: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fa40: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
fa50: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
fa60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
fa70: 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
fa80: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
fa90: 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
faa0: 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
fab0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fac0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
fad0: 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
fae0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
faf0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fb00: 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
fb10: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
fb20: 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
fb30: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
fb40: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fb50: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
fb60: 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
fb70: 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
fb80: 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
fb90: 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
fba0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
fbb0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
fbc0: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
fbd0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
fbe0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
fbf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
fc00: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
fc10: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
fc20: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
fc30: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
fc40: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
fc50: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
fc60: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
fc70: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
fc80: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
fc90: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
fca0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
fcb0: 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
fcc0: 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
fcd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
fce0: 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
fcf0: 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
fd00: 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
fd10: 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
fd20: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
fd30: 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
fd40: 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
fd50: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
fd60: 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
fd70: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
fd80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
fd90: 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
fda0: 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
fdb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
fdc0: 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
fdd0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
fde0: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
fdf0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
fe00: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
fe10: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
fe20: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
fe30: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
fe40: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
fe50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fe60: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
fe70: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
fe80: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
fe90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
fea0: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
feb0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
fec0: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
fed0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
fee0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
fef0: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
ff00: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
ff10: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43  eeEnter(p);.  pC
ff20: 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ur = pBt->pCurso
ff30: 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72  r;.  while( pCur
ff40: 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72   ){.    BtCursor
ff50: 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20   *pTmp = pCur;. 
ff60: 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e     pCur = pCur->
ff70: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
ff80: 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  Tmp->pBtree==p )
ff90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
ffa0: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
ffb0: 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pTmp);.    }.  }
ffc0: 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20  ..  /* Rollback 
ffd0: 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73  any active trans
ffe0: 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20  action and free 
fff0: 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63  the handle struc
10000 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  ture..  ** The c
10010 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
10020 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72  reeRollback() dr
10030 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f  ops any table-lo
10040 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a  cks held by.  **
10050 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20   this handle..  
10060 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
10070 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  eRollback(p);.  
10080 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10090 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
100a0 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
100b0 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
100c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
100d0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
100e0 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
100f0 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
10100 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
10110 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
10120 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
10130 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
10140 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
10150 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
10160 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
10170 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
10180 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
10190 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
101a0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
101b0 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
101c0 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
101d0 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
101e0 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
101f0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
10200 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
10210 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
10220 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
10230 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
10240 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
10250 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
10260 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
10270 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
10280 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
10290 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
102a0 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
102b0 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
102c0 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
102d0 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
102e0 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
102f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d  qlite3_free(pBt-
10300 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
10310 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
10320 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10330 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
10340 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10350 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
10360 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
10370 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
10380 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
10390 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
103a0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
103b0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
103c0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
103d0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
103e0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
103f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
10400 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
10410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10430 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
10440 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
10450 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
10460 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
10470 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
10480 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
10490 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
104a0 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
104b0 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
104c0 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
104d0 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
104e0 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
104f0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
10500 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
10510 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
10520 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
10530 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
10540 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
10550 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
10560 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
10570 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
10580 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10590 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
105a0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
105b0 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
105c0 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
105d0 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
105e0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
105f0 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
10600 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
10610 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
10620 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
10630 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
10640 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
10650 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
10660 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
10670 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
10680 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
10690 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
106a0 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
106b0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
106c0 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
106d0 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
106e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
106f0 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
10700 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
10710 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
10720 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
10730 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10740 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10750 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10760 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10770 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
10780 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
10790 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
107a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
107b0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
107c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
107d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
107e0 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
107f0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
10800 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
10810 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
10820 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
10830 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
10840 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
10850 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
10860 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
10870 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
10880 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
10890 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
108a0 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
108b0 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
108c0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
108d0 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
108e0 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
108f0 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
10900 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
10910 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
10920 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
10930 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
10940 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
10950 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
10960 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
10970 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
10980 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
10990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
109a0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
109b0 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
109c0 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
109d0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c  (Btree *p, int l
109e0 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79  evel, int fullSy
109f0 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  nc){.  BtShared 
10a00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
10a10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10a20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
10a30 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
10a40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10a50 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
10a60 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
10a70 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c  l(pBt->pPager, l
10a80 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b  evel, fullSync);
10a90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10aa0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
10ac0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
10ad0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
10ae0 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73  given btree is s
10af0 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76  et to safety lev
10b00 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a  el 1.  In other.
10b10 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  ** words, return
10b20 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63   TRUE if no sync
10b30 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65  () occurs on the
10b40 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a   disk files..*/.
10b50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10b60 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72  SyncDisabled(Btr
10b70 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
10b80 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
10b90 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
10ba0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10bb0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10bc0 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71  mutex) );  .  sq
10bd0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10be0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
10bf0 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
10c00 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
10c10 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42  e3PagerNosync(pB
10c20 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71  t->pPager);.  sq
10c30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10c40 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
10c50 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
10c60 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
10c70 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
10c80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10c90 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
10ca0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
10cb0 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
10cc0 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
10cd0 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
10ce0 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
10cf0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
10d00 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
10d10 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
10d20 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
10d30 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
10d40 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
10d50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10d60 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
10d70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
10d80 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
10d90 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
10da0 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
10db0 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
10dc0 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
10dd0 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
10de0 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
10df0 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
10e00 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
10e10 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
10e20 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
10e30 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
10e40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
10e50 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
10e60 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
10e70 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
10e80 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
10e90 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
10ea0 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
10eb0 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
10ec0 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
10ed0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
10ee0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
10ef0 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
10f00 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
10f10 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
10f20 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
10f30 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
10f40 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
10f50 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
10f60 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
10f70 65 20 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  e pageSizeFixed 
10f80 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
10f90 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
10fa0 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
10fb0 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
10fc0 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
10fd0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10fe0 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
10ff0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
11000 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
11010 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
11020 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11030 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
11040 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11050 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
11060 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
11070 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
11080 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11090 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
110a0 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29  >pageSizeFixed )
110b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
110c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
110d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
110e0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
110f0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
11100 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
11110 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
11120 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
11130 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
11140 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
11150 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
11160 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
11170 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
11180 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
11190 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
111a0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
111b0 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
111c0 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
111d0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
111e0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
111f0 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
11200 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
11210 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
11220 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
11230 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
11240 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
11250 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11260 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
11270 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
11280 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
11290 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
112a0 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
112b0 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
112c0 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
112d0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
112e0 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74  xed = 1;.  sqlit
112f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11300 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11310 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11320 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
11330 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
11340 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11350 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
11360 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
11370 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
11380 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
11390 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
113a0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
113b0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
113c0 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
113d0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
113e0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
113f0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
11400 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
11410 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
11420 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
11430 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
11440 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
11450 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
11460 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
11470 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11480 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
11490 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
114a0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
114b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
114c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
114d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
114e0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
114f0 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
11500 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
11510 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
11520 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
11530 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
11540 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
11550 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
11560 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
11570 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
11580 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
11590 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
115a0 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
115b0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
115c0 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
115d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
115e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
115f0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
11600 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
11610 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
11620 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11630 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11640 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
11650 65 74 20 74 68 65 20 73 65 63 75 72 65 44 65 6c  et the secureDel
11660 65 74 65 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ete flag if newF
11670 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
11680 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
11690 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
116a0 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
116b0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
116c0 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63 75 72  lue of the secur
116d0 65 44 65 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69  eDelete.** setti
116e0 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
116f0 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
11700 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
11710 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
11720 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
11730 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
11740 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
11750 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11760 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
11770 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
11780 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
11790 65 20 3d 20 28 6e 65 77 46 6c 61 67 21 3d 30 29  e = (newFlag!=0)
117a0 20 3f 20 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20   ? 1 : 0;.  } . 
117b0 20 62 20 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63   b = p->pBt->sec
117c0 75 72 65 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c  ureDelete;.  sql
117d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
117e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d  );.  return b;.}
117f0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
11800 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11810 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
11820 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
11830 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
11840 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
11850 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
11860 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
11870 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
11880 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
11890 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
118a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
118b0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
118c0 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
118d0 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
118e0 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
118f0 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
11900 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
11910 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
11920 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
11930 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
11940 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
11950 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11960 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
11970 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
11980 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
11990 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
119a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
119b0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
119c0 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
119d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
119e0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
119f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
11a00 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
11a10 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
11a20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11a30 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
11a40 65 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31  eFixed && (av ?1
11a50 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
11a60 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
11a70 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
11a80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11a90 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
11aa0 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
11ab0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
11ac0 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1: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 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
11b00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11b10 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
11b20 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
11b30 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
11b40 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
11b50 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
11b60 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
11b70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11b80 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
11b90 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
11ba0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11bb0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
11bc0 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
11bd0 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
11be0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
11bf0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11c00 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
11c10 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
11c20 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
11c30 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
11c40 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
11c50 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
11c60 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
11c70 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
11c80 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
11c90 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11ca0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11cb0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
11cc0 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
11cd0 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
11ce0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11cf0 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
11d00 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
11d10 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
11d20 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
11d30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11d40 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
11d50 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
11d60 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
11d70 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
11d80 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
11d90 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
11da0 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
11db0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
11dc0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
11dd0 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
11de0 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
11df0 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
11e00 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
11e10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
11e20 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
11e30 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
11e40 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
11e50 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  e1;.  int nPage;
11e60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
11e70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11e80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11e90 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
11ea0 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
11eb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
11ec0 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
11ed0 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
11ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
11ef0 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74  rn rc;.  rc = bt
11f00 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
11f10 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
11f20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11f30 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
11f40 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
11f50 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
11f60 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
11f70 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
11f80 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
11f90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11fa0 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20  .  */.  nPage = 
11fb0 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
11fc0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
11fd0 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
11fe0 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
11ff0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
12000 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
12010 67 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 67  ge))!=0 ){.    g
12020 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
12030 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69  ailed;.  }else i
12040 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
12050 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a    int pageSize;.
12060 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
12070 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
12080 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
12090 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
120a0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
120b0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
120c0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
120d0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
120e0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
120f0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
12100 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
12110 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72   ){.      pBt->r
12120 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadOnly = 1;.   
12130 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
12140 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
12150 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
12160 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
12170 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
12180 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  m embedded fract
12190 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63  ion must be exac
121a0 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68  tly 25%.  And th
121b0 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  e minimum.    **
121c0 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
121d0 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25  on must be 12.5%
121e0 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64   for both leaf-d
121f0 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66  ata and non-leaf
12200 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68  -data..    ** Th
12210 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
12220 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
12230 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
12240 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
12250 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
12260 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
12270 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
12280 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
12290 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
122a0 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
122b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
122c0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
122d0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
122e0 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
122f0 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b  yte(&page1[16]);
12300 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
12310 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
12320 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c  !=0 || pageSize<
12330 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28  512 ||.        (
12340 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
12350 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61  SIZE<32768 && pa
12360 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
12370 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20  X_PAGE_SIZE).   
12380 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12390 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
123a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
123b0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
123c0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
123d0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
123e0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
123f0 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
12400 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
12410 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
12420 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
12430 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
12440 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
12450 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
12460 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
12470 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
12480 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
12490 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
124a0 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
124b0 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
124c0 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
124d0 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
124e0 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
124f0 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
12500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
12510 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
12520 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
12530 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
12540 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
12550 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
12560 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
12570 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
12580 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
12590 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
125a0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
125b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
125c0 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
125d0 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
125e0 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
125f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12600 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
12610 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
12620 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
12650 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
12660 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12670 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
12680 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
12690 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
126a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
126b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
126c0 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  >pageSize = (u16
126d0 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70  )pageSize;.    p
126e0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
126f0 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65   (u16)usableSize
12700 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12710 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12720 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
12730 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
12740 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
12750 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
12760 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
12770 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
12780 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
12790 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
127a0 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
127b0 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
127c0 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
127d0 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
127e0 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
127f0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
12800 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
12810 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
12820 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
12830 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
12840 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
12850 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
12860 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
12870 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
12880 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
12890 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
128a0 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
128b0 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
128c0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
128d0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
128e0 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
128f0 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
12900 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
12910 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
12920 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
12930 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
12940 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
12950 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
12960 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
12970 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
12980 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
12990 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
129a0 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
129b0 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
129c0 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
129d0 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
129e0 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
129f0 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
12a00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
12a10 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *64/255 - 23;.  
12a20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
12a30 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
12a40 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
12a50 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
12a60 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
12a70 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e  ze - 35;.  pBt->
12a80 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e  minLeaf = (pBt->
12a90 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
12aa0 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73  2/255 - 23;.  as
12ab0 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
12ac0 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
12ad0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
12ae0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
12af0 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
12b00 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
12b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12b20 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
12b30 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
12b40 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
12b50 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
12b60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12b70 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  /*.** If there a
12b80 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
12b90 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65  g cursors and we
12ba0 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
12bb0 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74  middle.** of a t
12bc0 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74  ransaction but t
12bd0 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c  here is a read l
12be0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
12bf0 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69  ase, then.** thi
12c00 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73  s routine unrefs
12c10 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
12c20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12c30 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68  file which .** h
12c40 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  as the effect of
12c50 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72   releasing the r
12c60 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ead lock..**.** 
12c70 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72  If there is a tr
12c80 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
12c90 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74  gress, this rout
12ca0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
12cb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
12cc0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
12cd0 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ed(BtShared *pBt
12ce0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
12cf0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12d00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12d10 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43   assert( pBt->pC
12d20 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d  ursor==0 || pBt-
12d30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
12d40 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
12d50 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
12d60 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
12d70 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
12d80 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
12d90 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
12da0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
12db0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12dc0 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
12dd0 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
12de0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
12df0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
12e00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
12e10 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20  Bt->pPage1);.   
12e20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
12e30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
12e40 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
12e50 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
12e60 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
12e70 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
12e80 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
12e90 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
12ea0 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
12eb0 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
12ec0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
12ed0 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
12ee0 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
12ef0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
12f00 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
12f10 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
12f20 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
12f30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12f40 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12f50 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
12f60 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
12f70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12f80 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
12f90 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
12fa0 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
12fb0 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
12fc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
12fd0 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
12fe0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
12ff0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13000 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
13010 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
13020 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
13030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
13040 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
13050 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62  )==16 );.  put2b
13060 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70  yte(&data[16], p
13070 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
13080 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
13090 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
130a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
130b0 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
130c0 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
130d0 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
130e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
130f0 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
13100 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
13110 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
13120 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
13130 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
13140 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
13150 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
13160 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
13170 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
13180 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
13190 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
131a0 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
131b0 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
131c0 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
131d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
131e0 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
131f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
13200 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
13210 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
13220 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
13230 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
13240 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
13250 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
13260 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
13270 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
13280 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
13290 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
132a0 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
132b0 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
132c0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
132d0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
132e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
132f0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
13300 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
13310 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
13320 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
13330 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
13340 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
13350 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
13360 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
13370 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
13380 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13390 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
133a0 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
133b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
133c0 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
133d0 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
133e0 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
133f0 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
13400 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
13410 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
13420 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
13430 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
13440 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
13450 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
13460 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
13470 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
13480 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
13490 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
134a0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
134b0 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
134c0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
134d0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
134e0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
134f0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
13500 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
13510 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
13520 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
13530 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
13540 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
13550 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
13560 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
13570 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
13580 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
13590 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
135a0 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
135b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
135c0 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
135d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
135e0 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
135f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
13600 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
13610 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
13620 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
13630 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
13640 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
13650 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
13660 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
13670 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
13680 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
13690 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
136a0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
136b0 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
136c0 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
136d0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
136e0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
136f0 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
13700 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
13710 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
13720 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
13730 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
13740 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
13750 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
13760 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
13770 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
13780 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
13790 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
137a0 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
137b0 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
137c0 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
137d0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
137e0 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
137f0 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
13800 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
13810 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
13820 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
13830 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
13840 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
13850 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
13860 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
13870 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
13880 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
13890 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
138a0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
138b0 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
138c0 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
138d0 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
138e0 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
138f0 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
13900 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
13910 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
13920 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
13930 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
13940 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
13950 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
13960 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
13970 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
13980 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13990 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
139a0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
139b0 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
139c0 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
139d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
139e0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
139f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13a00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13a10 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
13a20 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
13a30 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
13a40 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
13a50 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
13a60 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
13a70 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
13a80 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
13a90 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
13aa0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
13ab0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
13ac0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
13ad0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13ae0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
13af0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
13b00 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
13b10 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
13b20 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
13b30 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
13b40 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
13b50 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
13b60 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
13b70 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
13b80 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
13b90 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
13ba0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
13bb0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13bc0 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
13bd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13be0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
13bf0 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
13c00 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
13c10 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
13c20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13c30 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
13c40 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
13c50 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
13c60 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
13c70 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
13c80 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
13c90 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
13ca0 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
13cb0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
13cc0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
13cd0 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73  RITE) || pBt->is
13ce0 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70  Pending ){.    p
13cf0 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
13d00 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
13d10 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
13d20 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
13d30 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
13d40 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
13d50 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
13d60 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
13d70 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
13d80 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
13d90 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
13da0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
13db0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13dc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
13dd0 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
13de0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
13df0 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
13e00 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
13e10 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
13e20 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
13e30 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
13e40 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
13e50 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
13e60 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
13e70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
13e80 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
13e90 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
13ea0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
13eb0 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
13ec0 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
13ed0 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
13ee0 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
13ef0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
13f00 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
13f10 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
13f20 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
13f30 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
13f40 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
13f50 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
13f60 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
13f70 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
13f80 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70  Bt->initiallyEmp
13f90 74 79 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3d  ty = pBt->nPage=
13fa0 3d 30 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  =0;.  do {.    /
13fb0 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
13fc0 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
13fd0 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
13fe0 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
13ff0 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
14000 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
14010 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
14020 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
14030 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
14040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
14050 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
14060 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
14070 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
14080 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
14090 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
140a0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
140b0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
140c0 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
140d0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
140e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
140f0 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
14100 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
14110 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
14120 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
14130 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
14140 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
14150 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
14160 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
14170 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
14180 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
14190 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
141a0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
141b0 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
141c0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
141d0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
141e0 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
141f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14200 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
14210 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
14220 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
14230 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
14240 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
14250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14260 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
14270 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
14280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14290 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
142a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
142b0 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
142c0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
142d0 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
142e0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
142f0 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
14300 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
14310 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
14320 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
14330 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
14340 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
14350 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14360 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
14370 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
14380 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
14390 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
143a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
143b0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
143c0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
143d0 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  {..assert( p->lo
143e0 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
143f0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
14400 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
14410 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
14420 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
14430 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
14440 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
14450 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
14460 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
14470 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
14480 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
14490 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
144a0 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
144b0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
144c0 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
144d0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
144e0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
144f0 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
14500 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
14510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14520 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28  ED_CACHE.    if(
14530 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
14540 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
14550 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
14560 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
14570 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45  ;.      pBt->isE
14580 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28  xclusive = (u8)(
14590 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d  wrflag>1);.    }
145a0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72  .#endif.  }...tr
145b0 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
145c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
145d0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
145e0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
145f0 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
14600 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
14610 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
14620 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
14630 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
14640 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
14650 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
14660 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
14670 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
14680 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
14690 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
146a0 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
146b0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
146c0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
146d0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
146e0 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
146f0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
14700 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
14710 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
14720 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14730 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14740 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14750 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
14760 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
14770 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
14780 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
14790 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
147a0 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
147b0 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
147c0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
147d0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
147e0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
147f0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
14800 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
14810 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
14820 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
14830 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
14840 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
14850 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
14880 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
14890 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
148b0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
148c0 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
148d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
14900 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
14910 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
14920 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
14930 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
14940 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
14950 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
14960 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14970 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14980 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
14990 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  x) );.  rc = btr
149a0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
149b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
149c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
149d0 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
149e0 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
149f0 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
14a00 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
14a10 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
14a20 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
14a30 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
14a40 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
14a50 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
14a60 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
14a70 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
14a80 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
14a90 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
14aa0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
14ab0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
14ac0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
14ad0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
14ae0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
14af0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
14b00 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
14b10 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
14b20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
14b30 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
14b40 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
14b50 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
14b60 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
14b70 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
14b80 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68  rc);.  }..set_ch
14b90 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a  ild_ptrmaps_out:
14ba0 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
14bb0 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
14bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14bd0 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
14be0 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
14bf0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
14c00 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
14c10 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
14c20 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
14c30 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
14c40 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
14c50 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
14c60 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
14c70 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
14c80 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
14c90 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
14ca0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
14cb0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
14cc0 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
14cd0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
14ce0 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
14cf0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
14d00 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
14d10 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
14d20 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
14d30 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
14d40 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
14d50 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
14d60 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
14d70 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
14d80 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
14d90 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
14da0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
14db0 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
14dc0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
14dd0 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
14e00 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
14e10 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
14e20 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
14e30 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
14e40 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
14e50 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
14e60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14e70 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
14e80 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
14e90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14ea0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
14eb0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
14ec0 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
14ed0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
14ee0 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
14ef0 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
14f00 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
14f10 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
14f20 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
14f30 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
14f40 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
14f50 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
14f60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14f70 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14f80 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65    }.    put4byte
14f90 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
14fa0 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  To);.  }else{.  
14fb0 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
14fc0 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
14fd0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14fe0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
14ff0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
15000 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  age);.    nCell 
15010 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
15020 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15030 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
15040 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
15050 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
15060 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
15070 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
15080 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
15090 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
150a0 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73         btreePars
150b0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
150c0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
150d0 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
150e0 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
150f0 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
15100 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
15110 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
15120 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
15130 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
15140 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
15150 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
15160 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15180 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
15190 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
151a0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
151b0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
151c0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
151d0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
151e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
151f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15200 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
15210 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
15220 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
15230 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
15240 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
15250 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
15260 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
15270 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
15280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
15290 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
152a0 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
152b0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
152c0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
152d0 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
152e0 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
152f0 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
15300 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
15310 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
15320 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
15330 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
15340 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
15350 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
15360 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
15370 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
15380 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
15390 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
153a0 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
153b0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
153c0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
153d0 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
153e0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
153f0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
15400 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
15410 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
15420 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
15430 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
15440 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
15450 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
15460 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
15470 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
15480 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
15490 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
154a0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
154b0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
154c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
154d0 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
154e0 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
154f0 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15510 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
15520 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
15530 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
15540 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
15550 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
15560 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
15570 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
15580 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
15590 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
155a0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
155b0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
155c0 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
155d0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
155e0 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
155f0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
15600 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
15610 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
15620 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
15630 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
15640 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
15650 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
15660 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
15670 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
15680 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
15690 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
156a0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
156b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
156c0 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
156d0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
156e0 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
156f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
15700 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
15710 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
15720 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15730 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
15740 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
15750 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
15760 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
15770 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
15780 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
15790 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
157a0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
157b0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
157c0 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
157d0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
157e0 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
157f0 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
15800 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
15810 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
15820 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
15830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15840 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
15850 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
15860 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
15870 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
15880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15890 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
158a0 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
158b0 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
158c0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
158d0 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
158e0 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
158f0 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
15900 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
15910 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
15920 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
15930 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
15940 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
15950 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
15960 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
15970 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
15980 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
15990 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
159a0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
159b0 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
159c0 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
159d0 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
159e0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
159f0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
15a00 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
15a10 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
15a20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
15a30 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
15a40 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
15a50 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
15a60 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
15a70 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
15a80 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
15a90 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
15aa0 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
15ab0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
15ac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15ad0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15ae0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
15af0 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
15b00 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
15b10 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
15b20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
15b30 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
15b40 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
15b50 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
15b60 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
15b70 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
15b80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15b90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15ba0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
15bb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
15bc0 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
15bd0 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
15be0 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
15bf0 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
15c00 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
15c10 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
15c20 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
15c30 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
15c40 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
15c50 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
15c60 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
15c70 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
15c80 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
15c90 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
15ca0 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
15cb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15cc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
15cd0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
15ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15cf0 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
15d00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
15d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15d20 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
15d30 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
15d40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
15d50 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
15d60 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
15d70 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
15d80 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
15d90 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
15da0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
15db0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
15dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15dd0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
15de0 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
15df0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
15e00 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
15e10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15e20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
15e30 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
15e40 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
15e50 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
15e60 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
15e70 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
15e80 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
15e90 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
15ea0 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
15eb0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
15ec0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
15ed0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
15ee0 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
15ef0 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
15f00 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
15f10 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
15f20 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
15f30 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
15f40 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
15f50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
15f60 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
15f70 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
15f80 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
15f90 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
15fa0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
15fb0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
15fc0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
15fd0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
15fe0 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
15ff0 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
16000 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
16010 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
16020 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
16030 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
16040 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
16050 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
16060 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
16070 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
16080 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
16090 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
160a0 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
160b0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
160c0 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
160d0 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
160e0 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
160f0 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
16100 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e 46  complete.  If nF
16110 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74 20 69  in is zero, it i
16120 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
16130 2a 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  * incrVacuumStep
16140 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  () will be calle
16150 64 20 61 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e  d a finite amoun
16160 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68  t of times.** wh
16170 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
16180 6f 74 20 65 6d 70 74 79 20 74 68 65 20 66 72 65  ot empty the fre
16190 65 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c 20 61  elist.  A full a
161a0 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73  utovacuum.** has
161b0 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50 52 41   nFin>0.  A "PRA
161c0 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  GMA incremental_
161d0 76 61 63 75 75 6d 22 20 68 61 73 20 6e 46 69 6e  vacuum" has nFin
161e0 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ==0..*/.static i
161f0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
16200 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
16210 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
16220 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
16230 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
16240 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16250 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
16260 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
16270 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
16280 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16290 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
162a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
162b0 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
162c0 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
162d0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
162e0 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
162f0 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
16300 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
16310 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
16320 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
16330 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
16340 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
16350 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
16360 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
16370 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
16380 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16390 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
163a0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
163b0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
163c0 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
163d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
163e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
163f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16400 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
16410 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
16420 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16430 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
16440 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
16450 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
16460 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
16470 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
16480 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
16490 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
164a0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
164b0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
164c0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
164d0 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
164e0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
164f0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
16500 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
16510 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
16520 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
16530 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
16540 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
16550 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
16560 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
16570 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
16580 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
16590 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
165a0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
165b0 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
165c0 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
165d0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
165e0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
165f0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
16600 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
16610 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
16620 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16630 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16640 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16650 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
16660 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
16670 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
16680 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
16690 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
166a0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
166b0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
166c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
166d0 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
166e0 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
166f0 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
16700 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
16710 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
16720 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
16730 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
16740 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
16750 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16760 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16770 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
16780 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
16790 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
167a0 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
167b0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
167c0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
167d0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
167e0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
167f0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
16800 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
16810 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
16820 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
16830 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
16840 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
16850 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
16860 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
16870 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
16880 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
16890 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
168a0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
168b0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
168c0 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
168d0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
168e0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
168f0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
16900 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
16910 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
16920 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
16930 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16940 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
16950 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
16960 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
16970 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
16990 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
169a0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
169b0 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
169c0 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
169d0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
169e0 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
169f0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
16a00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
16a10 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
16a20 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
16a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16a40 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
16a50 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
16a60 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
16a70 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
16a80 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
16a90 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
16aa0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
16ab0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16ac0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16ad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16ae0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16af0 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
16b00 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
16b10 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
16b20 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
16b30 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
16b40 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
16b50 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
16b60 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
16b70 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
16b80 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
16b90 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
16ba0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
16bb0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
16bc0 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
16bd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16be0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16bf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16c10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16c20 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
16c30 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
16c40 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
16c50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16c60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16c70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16c80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16c90 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50    }.      iLastP
16ca0 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g--;.    }.    s
16cb0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
16cc0 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
16cd0 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a  ager, iLastPg);.
16ce0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
16cf0 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
16d00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16d10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
16d20 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
16d30 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
16d40 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
16d50 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
16d60 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
16d70 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
16d80 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
16d90 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
16da0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
16db0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
16dc0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
16dd0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
16de0 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
16df0 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
16e00 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
16e10 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
16e20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
16e30 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
16e40 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
16e50 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
16e60 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
16e70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16e80 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
16e90 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
16ea0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16eb0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
16ec0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16ed0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
16ee0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
16ef0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
16f00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
16f10 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
16f20 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
16f30 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
16f40 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
16f50 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
16f60 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
16f70 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
16f80 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
16f90 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72 50  p(pBt, 0, pagerP
16fa0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a  agecount(pBt));.
16fb0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16fc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16fd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16fe0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
16ff0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
17000 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
17010 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
17020 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
17030 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
17040 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17050 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
17070 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
17080 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
17090 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
170a0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
170b0 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
170c0 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
170d0 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
170e0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
170f0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
17100 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
17110 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
17120 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
17130 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
17140 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
17150 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
17160 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
17170 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
17180 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
17190 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
171a0 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
171b0 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
171c0 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
171d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
171e0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
171f0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
17200 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17210 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
17220 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
17230 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
17240 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
17250 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
17260 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
17270 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17280 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
17290 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
172a0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
172b0 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
172c0 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
172d0 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
172e0 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
172f0 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
17300 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17310 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
17320 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
17330 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
17340 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
17350 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17360 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
17370 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
17380 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72  */.    Pgno nPtr
17390 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  map;      /* Num
173a0 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
173b0 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
173c0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
173d0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
173e0 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
173f0 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e   freed */.    in
17400 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
17410 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
17420 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
17430 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  map page */.    
17440 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
17450 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
17460 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
17470 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
17480 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
17490 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
174a0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
174b0 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
174c0 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
174d0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
174e0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
174f0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
17500 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
17510 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
17520 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
17530 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
17540 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
17550 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
17560 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
17570 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
17580 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
17590 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
175a0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
175b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
175c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
175d0 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
175e0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
175f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
17600 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d  ]);.    nEntry =
17610 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17620 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20  /5;.    nPtrmap 
17630 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
17640 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
17650 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
17660 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69  /nEntry;.    nFi
17670 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
17680 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
17690 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
176a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
176b0 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
176c0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
176d0 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
176e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
176f0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
17700 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
17710 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
17720 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
17730 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
17740 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e   }.    if( nFin>
17750 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
17760 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
17770 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72  PT;..    for(iFr
17780 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
17790 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
177a0 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
177b0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
177c0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
177d0 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20  nFin, iFree);.  
177e0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
177f0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
17800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
17810 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
17820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17830 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
17840 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
17850 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
17860 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
17870 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
17880 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
17890 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
178a0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
178b0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
178c0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
178d0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 73 71   nFin);.      sq
178e0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
178f0 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
17900 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  ger, nFin);.    
17910 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
17920 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
17930 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17940 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17950 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
17960 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
17970 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
17980 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
17990 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
179a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
179b0 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
179c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
179d0 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
179e0 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
179f0 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
17a00 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
17a10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
17a20 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
17a30 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
17a40 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
17a50 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
17a60 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
17a70 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
17a80 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
17a90 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
17aa0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
17ab0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
17ac0 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
17ad0 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
17ae0 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
17af0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
17b00 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
17b10 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
17b20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
17b30 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
17b40 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
17b50 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
17b60 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
17b70 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
17b80 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
17b90 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
17ba0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
17bb0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
17bc0 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
17bd0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
17be0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
17bf0 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
17c00 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
17c10 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
17c20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17c30 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
17c40 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
17c50 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
17c60 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
17c70 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
17c80 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
17c90 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
17ca0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
17cb0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
17cc0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
17cd0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
17ce0 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
17cf0 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
17d00 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
17d10 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
17d20 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
17d30 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
17d40 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
17d50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17d60 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
17d70 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
17d80 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
17d90 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
17da0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
17db0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
17dc0 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
17dd0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
17de0 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
17df0 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
17e00 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
17e10 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
17e20 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
17e30 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
17e40 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
17e50 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
17e60 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
17e70 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
17e80 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
17e90 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
17ea0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
17eb0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
17ec0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
17ed0 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
17ee0 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
17ef0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
17f00 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
17f10 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
17f20 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
17f30 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
17f40 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
17f50 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
17f60 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
17f70 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
17f80 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
17f90 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
17fa0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17fb0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
17fc0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
17fd0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
17fe0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
17ff0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
18000 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
18010 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18020 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
18030 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
18040 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
18050 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
18060 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
18070 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
18090 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
180a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
180b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
180c0 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
180d0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
180e0 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
180f0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
18100 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
18110 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18120 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18130 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
18140 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
18150 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
18160 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
18170 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
18180 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
18190 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
181a0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
181b0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
181c0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
181d0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
181e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
181f0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
18200 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
18210 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 62 74 72  tex(p) );..  btr
18220 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
18230 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70 2d  t(pBt);.  if( p-
18240 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
18250 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63  ONE && p->db->ac
18260 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20 29 7b  tiveVdbeCnt>1 ){
18270 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
18280 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
18290 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
182a0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
182b0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
182c0 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
182d0 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
182e0 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
182f0 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
18300 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
18310 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
18320 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
18330 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
18340 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
18350 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
18360 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
18370 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
18380 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
18390 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
183a0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
183b0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
183c0 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
183d0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
183e0 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
183f0 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
18400 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
18410 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
18420 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
18430 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
18440 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
18450 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
18460 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
18470 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
18480 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
18490 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
184a0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
184b0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
184c0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
184d0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
184e0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
184f0 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
18500 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
18510 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
18520 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18530 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
18540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18550 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
18560 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
18570 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
18580 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
18590 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
185a0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
185b0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
185c0 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
185d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
185e0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
185f0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
18600 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
18610 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
18620 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
18630 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
18640 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
18650 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
18660 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
18670 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18680 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
18690 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
186a0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
186b0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
186c0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
186d0 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
186e0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
186f0 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
18700 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
18710 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
18720 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
18730 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
18740 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
18750 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
18760 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
18770 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
18780 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
18790 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
187a0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
187b0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
187c0 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
187d0 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
187e0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
187f0 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
18800 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
18810 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
18820 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
18830 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
18840 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
18850 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
18860 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
18870 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
18880 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
18890 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
188a0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
188b0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
188c0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
188d0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
188e0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
188f0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
18900 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18910 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
18920 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
18930 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18940 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
18950 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
18960 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
18970 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
18980 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
18990 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
189a0 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
189b0 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
189c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
189d0 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
189e0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
189f0 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
18a00 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
18a10 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
18a20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
18a30 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
18a40 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
18a50 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
18a60 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
18a70 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
18a80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18a90 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
18aa0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
18ab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18ac0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
18ad0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18ae0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18af0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
18b00 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
18b10 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
18b20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
18b30 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
18b40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18b50 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
18b60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18b70 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
18b80 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
18b90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18ba0 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
18bb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
18bc0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18bd0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
18be0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
18bf0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
18c00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18c10 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
18c20 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
18c30 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
18c40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18c50 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18c60 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
18c70 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
18c80 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
18c90 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
18ca0 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
18cb0 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
18cc0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
18cd0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
18ce0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
18cf0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
18d00 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
18d10 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
18d20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
18d30 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
18d40 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
18d50 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
18d60 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
18d70 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
18d80 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
18d90 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
18da0 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
18db0 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
18dc0 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
18dd0 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
18de0 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
18df0 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
18e00 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
18e10 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
18e20 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
18e30 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
18e40 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
18e50 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
18e60 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
18e70 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
18e80 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
18e90 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
18ea0 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
18eb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
18ec0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
18ed0 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
18ee0 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
18ef0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18f00 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
18f10 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
18f20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
18f30 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
18f40 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
18f50 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
18f60 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
18f70 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
18f80 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
18f90 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
18fa0 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
18fb0 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
18fc0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
18fd0 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
18fe0 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
18ff0 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
19000 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
19010 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
19020 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
19030 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
19040 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
19050 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
19060 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
19070 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
19080 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
19090 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
190a0 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
190b0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
190c0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
190d0 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
190e0 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
190f0 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
19100 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
19110 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
19120 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
19130 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
19140 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
19150 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
19160 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
19170 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
19180 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
19190 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
191a0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
191b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
191c0 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
191d0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
191e0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
191f0 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
19200 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19210 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
19220 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
19230 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
19240 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20    p->skipNext = 
19250 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72  errCode;.    for
19260 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
19270 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
19280 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70  eleasePage(p->ap
19290 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Page[i]);.      
192a0 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30  p->apPage[i] = 0
192b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
192c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
192d0 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pBtree);.}../*.*
192e0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
192f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
19300 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72  ogress.  All cur
19310 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  sors will be.** 
19320 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69  invalided by thi
19330 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
19340 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
19350 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61   a cursor.** tha
19360 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
19370 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
19380 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69  his operation wi
19390 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ll result.** in 
193a0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
193b0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
193c0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
193d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
193e0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
193f0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
19400 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
19410 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
19420 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
19430 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
19440 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29  llback(Btree *p)
19450 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
19460 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19470 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
19480 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69  *pPage1;..  sqli
19490 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
194a0 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c  ;.  rc = saveAll
194b0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
194c0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
194d0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
194e0 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53  ACHE.  if( rc!=S
194f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19500 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72  /* This is a hor
19510 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e  rible situation.
19520 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   An IO or malloc
19530 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  () error occurre
19540 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20  d whilst.    ** 
19550 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63  trying to save c
19560 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e  ursor positions.
19570 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
19580 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63  utomatic rollbac
19590 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65  k (as.    ** the
195a0 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e   result of a con
195b0 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28  straint, malloc(
195c0 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20  ) failure or IO 
195d0 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20  error) then .   
195e0 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61   ** the cache ma
195f0 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  y be internally 
19600 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f  inconsistent (no
19610 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20  t contain valid 
19620 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a  trees) so.    **
19630 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c   we cannot simpl
19640 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  y return the err
19650 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  or to the caller
19660 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74  . Instead, abort
19670 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65   .    ** all que
19680 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  ries that may be
19690 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68   using any of th
196a0 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66  e cursors that f
196b0 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20  ailed to save.. 
196c0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
196d0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
196e0 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d  sors(p, rc);.  }
196f0 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49  .#endif.  btreeI
19700 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
19710 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
19720 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
19730 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
19740 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
19750 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
19760 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
19770 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
19780 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
19790 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
197a0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
197b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
197c0 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
197d0 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
197e0 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
197f0 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
19800 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
19810 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
19820 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
19830 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
19840 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
19850 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
19860 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
19870 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
19880 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
19890 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
198a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
198b0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
198c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
198d0 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
198e0 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
198f0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
19900 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
19910 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  READ;.  }..  btr
19920 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
19930 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
19940 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
19950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19960 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
19970 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
19980 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
19990 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20  saction can can 
199a0 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
199b0 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
199c0 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
199d0 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
199e0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
199f0 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
19a00 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
19a10 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
19a20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
19a30 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
19a40 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
19a50 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
19a60 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
19a70 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
19a80 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
19a90 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
19aa0 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
19ab0 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
19ac0 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
19ad0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
19ae0 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
19af0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
19b00 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
19b10 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
19b20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
19b30 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
19b40 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
19b50 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
19b60 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
19b70 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
19b80 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
19b90 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
19ba0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
19bb0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
19bc0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
19bd0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
19be0 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
19bf0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
19c00 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
19c10 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
19c20 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
19c30 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
19c40 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
19c50 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
19c60 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
19c70 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
19c80 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
19c90 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
19ca0 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
19cb0 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
19cc0 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
19cd0 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
19ce0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
19cf0 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
19d00 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
19d10 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
19d20 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
19d30 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
19d40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19d50 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
19d60 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
19d70 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
19d80 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
19d90 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
19da0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19db0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
19dc0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19dd0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
19de0 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  rt( pBt->readOnl
19df0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
19e00 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
19e10 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
19e20 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
19e30 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
19e40 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
19e50 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
19e60 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
19e70 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
19e80 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
19e90 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
19ea0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
19eb0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
19ec0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
19ed0 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
19ee0 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
19ef0 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
19f00 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
19f10 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
19f20 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
19f30 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
19f40 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
19f50 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
19f60 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
19f70 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
19f80 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
19f90 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
19fa0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
19fb0 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
19fc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19fd0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
19fe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
19ff0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1a000 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1a010 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
1a020 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1a030 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
1a040 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
1a050 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
1a060 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
1a070 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
1a080 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
1a090 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
1a0a0 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
1a0b0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
1a0c0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
1a0d0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1a0e0 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
1a0f0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1a100 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
1a110 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
1a120 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
1a130 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
1a140 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
1a150 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
1a160 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
1a170 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
1a180 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
1a190 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
1a1a0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
1a1b0 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
1a1c0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
1a1d0 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
1a1e0 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
1a1f0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
1a200 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
1a210 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
1a220 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
1a230 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
1a240 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
1a250 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
1a260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1a270 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
1a280 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a290 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1a2a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a2b0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
1a2c0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
1a2d0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
1a2e0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
1a2f0 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
1a300 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
1a310 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
1a320 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
1a330 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
1a340 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1a350 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a360 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
1a370 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
1a380 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
1a390 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a3a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1a3b0 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
1a3c0 26 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79  & pBt->initially
1a3d0 45 6d 70 74 79 20 29 20 70 42 74 2d 3e 6e 50 61  Empty ) pBt->nPa
1a3e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ge = 0;.      rc
1a3f0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1a400 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
1a410 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1a420 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
1a430 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  1->aData);.    }
1a440 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1a450 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1a460 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a470 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
1a480 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
1a490 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
1a4a0 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
1a4b0 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
1a4c0 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
1a4d0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1a4e0 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1a4f0 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
1a500 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
1a510 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
1a520 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
1a530 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
1a540 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
1a550 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
1a560 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1a570 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
1a580 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
1a590 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
1a5a0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
1a5b0 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  **.** If wrFlag=
1a5c0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =0, then the cur
1a5d0 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  sor can only be 
1a5e0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
1a5f0 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  ..** If wrFlag==
1a600 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  1, then the curs
1a610 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  or can be used f
1a620 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
1a630 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20  r.** writing if 
1a640 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
1a650 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65   for writing are
1a660 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
1a670 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e  e.** are the con
1a680 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
1a690 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
1a6a0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  r for writing to
1a6b0 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a  .** be allowed:.
1a6c0 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
1a6d0 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
1a6e0 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
1a6f0 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20  wrFlag==1.**.** 
1a700 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
1a710 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1a720 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
1a730 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
1a740 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
1a750 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
1a760 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
1a770 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
1a780 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
1a790 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
1a7a0 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
1a7b0 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
1a7c0 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
1a7d0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
1a7e0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
1a7f0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
1a800 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
1a810 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
1a820 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
1a830 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
1a840 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
1a850 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
1a860 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
1a870 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
1a880 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
1a890 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
1a8a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1a8b0 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
1a8c0 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
1a8d0 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
1a8e0 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
1a8f0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
1a900 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
1a910 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
1a920 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
1a930 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
1a940 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
1a950 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
1a960 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1a970 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1a980 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
1a990 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
1a9a0 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
1a9b0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
1a9c0 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
1a9d0 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1a9e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1a9f0 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
1aa00 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1aa30 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1aa40 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa60 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1aa70 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1aa80 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1aab0 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1aac0 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1aad0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1aae0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1aaf0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1ab00 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1ab10 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
1ab20 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab40 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
1ab50 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
1ab60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ab70 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
1ab80 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1ab90 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
1aba0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
1abb0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1abc0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
1abd0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1abe0 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a  | wrFlag==1 );..
1abf0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1ac00 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
1ac10 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
1ac20 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
1ac30 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
1ac40 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
1ac50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
1ac60 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
1ac70 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
1ac80 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
1ac90 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
1aca0 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
1acb0 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
1acc0 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
1acd0 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
1ace0 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
1acf0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1ad00 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
1ad10 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c  KeyInfo!=0, wrFl
1ad20 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ag+1) );.  asser
1ad30 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1ad40 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
1ad50 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
1ad60 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
1ad70 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1ad80 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
1ad90 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
1ada0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
1adb0 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1adc0 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
1add0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
1ade0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1adf0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1ae00 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
1ae10 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
1ae20 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20  aData );..  if( 
1ae30 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20  NEVER(wrFlag && 
1ae40 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  pBt->readOnly) )
1ae50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ae60 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1ae70 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
1ae80 31 20 26 26 20 70 61 67 65 72 50 61 67 65 63 6f  1 && pagerPageco
1ae90 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
1aea0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1aeb0 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20 2f  _EMPTY;.  }..  /
1aec0 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
1aed0 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
1aee0 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
1aef0 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
1af00 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
1af10 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
1af20 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
1af30 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
1af40 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
1af50 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
1af60 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
1af70 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
1af80 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
1af90 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
1afa0 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
1afb0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
1afc0 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75  Cur->wrFlag = (u
1afd0 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  8)wrFlag;.  pCur
1afe0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
1aff0 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
1b000 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
1b010 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1b020 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
1b030 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1b040 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
1b050 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1b060 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e  NVALID;.  pCur->
1b070 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b  cachedRowid = 0;
1b080 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b090 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
1b0a0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
1b0b0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b0e0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
1b0f0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1b120 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1b130 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1b140 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1b170 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1b180 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1b190 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1b1a0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1b1b0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1b1c0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
1b1d0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
1b1e0 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
1b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b200 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
1b210 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
1b220 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1b230 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b240 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
1b250 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
1b260 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
1b270 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
1b280 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1b290 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b2a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1b2b0 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
1b2c0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
1b2d0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
1b2e0 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
1b2f0 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
1b300 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
1b310 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
1b320 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
1b330 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
1b340 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
1b350 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
1b360 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
1b370 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
1b380 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
1b390 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
1b3a0 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
1b3b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1b3c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b3d0 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
1b3e0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
1b3f0 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
1b400 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
1b410 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
1b420 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
1b430 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
1b440 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
1b450 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
1b460 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
1b470 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
1b480 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
1b490 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
1b4a0 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
1b4b0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
1b4c0 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
1b4d0 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
1b4e0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
1b4f0 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
1b500 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
1b510 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
1b520 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
1b530 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
1b540 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
1b550 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
1b560 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1b570 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
1b580 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
1b590 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
1b5a0 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
1b5b0 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
1b5c0 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20   Set the cached 
1b5d0 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65  rowid value of e
1b5e0 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74  very cursor in t
1b5f0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
1b600 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72   file.** as pCur
1b610 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20   and having the 
1b620 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
1b630 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20  umber as pCur.  
1b640 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  The value is.** 
1b650 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a  set to iRowid..*
1b660 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69  *.** Only positi
1b670 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20  ve rowid values 
1b680 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76  are considered v
1b690 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61  alid for this ca
1b6a0 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68  che..** The cach
1b6b0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
1b6c0 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61   to zero, indica
1b6d0 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20  ting an invalid 
1b6e0 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65  cache..** A btre
1b6f0 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  e will work fine
1b700 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65   with zero or ne
1b710 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20  gative rowids.  
1b720 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a  We just cannot.*
1b730 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20  * cache zero or 
1b740 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c  negative rowids,
1b750 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62   which means tab
1b760 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72  les that use zer
1b770 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65  o or.** negative
1b780 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75   rowids might ru
1b790 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
1b7a0 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74  r.  But in pract
1b7b0 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ice, zero.** or 
1b7c0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1b7d0 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f  are very uncommo
1b7e0 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64  n so this should
1b7f0 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
1b800 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
1b810 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
1b820 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
1b830 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pCur, sqlite3_in
1b840 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42  t64 iRowid){.  B
1b850 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
1b860 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70  r(p=pCur->pBt->p
1b870 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1b880 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1b890 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75  p->pgnoRoot==pCu
1b8a0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d  r->pgnoRoot ) p-
1b8b0 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69  >cachedRowid = i
1b8c0 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Rowid;.  }.  ass
1b8d0 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65  ert( pCur->cache
1b8e0 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29  dRowid==iRowid )
1b8f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b900 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  n the cached row
1b910 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
1b920 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61   cursor.  A nega
1b930 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  tive or zero.** 
1b940 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
1b950 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1b960 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69  rowid cache is i
1b970 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
1b980 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  d be.** ignored.
1b990 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63    If the rowid c
1b9a0 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62  ache has never b
1b9b0 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20  efore been set, 
1b9c0 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69  then a.** zero i
1b9d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1b9e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
1b9f0 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
1ba00 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
1ba10 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
1ba20 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  n pCur->cachedRo
1ba30 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  wid;.}../*.** Cl
1ba40 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
1ba50 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
1ba60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ba70 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
1ba80 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
1ba90 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
1baa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1bab0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
1bac0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1bad0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1bae0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
1baf0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
1bb00 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1bb10 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1bb20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
1bb30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1bb40 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
1bb50 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
1bb60 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
1bb70 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
1bb80 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1bb90 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
1bba0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1bbb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
1bbc0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1bbd0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1bbe0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
1bbf0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
1bc00 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1bc10 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
1bc20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
1bc30 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1bc40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1bc50 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1bc60 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
1bc70 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1bc80 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1bc90 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
1bca0 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
1bcb0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
1bcc0 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
1bcd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1bce0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1bcf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1bd00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1bd10 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
1bd20 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
1bd30 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
1bd40 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
1bd50 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
1bd60 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
1bd70 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
1bd80 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
1bd90 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
1bda0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
1bdb0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
1bdc0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
1bdd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
1bde0 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
1bdf0 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
1be00 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
1be10 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
1be20 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
1be30 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
1be40 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
1be50 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
1be60 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
1be70 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
1be80 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
1be90 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
1bea0 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
1beb0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
1bec0 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
1bed0 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
1bee0 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
1bef0 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
1bf00 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
1bf10 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
1bf20 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1bf30 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
1bf40 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
1bf50 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
1bf60 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
1bf70 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
1bf80 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
1bf90 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
1bfa0 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
1bfb0 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
1bfc0 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
1bfd0 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
1bfe0 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
1bff0 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
1c000 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1c010 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
1c020 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
1c030 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1c040 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
1c050 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
1c060 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
1c070 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1c080 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1c090 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
1c0a0 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
1c0b0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
1c0c0 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
1c0d0 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
1c0e0 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
1c0f0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
1c100 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
1c110 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
1c120 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
1c130 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
1c140 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
1c150 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
1c160 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
1c170 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
1c180 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
1c190 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1c1a0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1c1b0 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
1c1c0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1c1d0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
1c1e0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1c1f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1c200 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1c210 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1c220 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
1c230 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
1c240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c250 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1c260 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1c270 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
1c280 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
1c290 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
1c2a0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
1c2b0 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
1c2c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
1c2d0 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
1c2e0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
1c330 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1c340 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c370 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1c380 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1c390 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
1c3d0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1c3e0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1c3f0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1c400 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1c410 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61  ; \.    pCur->va
1c420 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20  lidNKey = 1;    
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c460 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
1c4c0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c500 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
1c510 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
1c520 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1c530 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
1c540 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
1c550 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1c560 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
1c570 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1c580 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
1c590 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
1c5a0 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
1c5b0 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
1c5c0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1c5d0 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
1c5e0 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
1c5f0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
1c600 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
1c610 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1c620 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1c630 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
1c640 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c650 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1c660 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1c670 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1c680 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1c690 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
1c6a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
1c6b0 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
1c6c0 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
1c6d0 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
1c6e0 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
1c6f0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
1c700 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
1c710 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
1c720 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1c730 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
1c740 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
1c750 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
1c760 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
1c770 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
1c780 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
1c790 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
1c7a0 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
1c7b0 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
1c7c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1c7d0 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
1c7e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1c7f0 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
1c800 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
1c810 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1c820 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
1c830 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1c840 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
1c850 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1c860 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
1c870 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1c880 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
1c890 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
1c8a0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1c8b0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c8c0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1c8d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1c8e0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
1c8f0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
1c900 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1c910 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1c920 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
1c930 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   ){.    *pSize =
1c940 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1c950 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1c960 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  r);.    *pSize =
1c970 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1c980 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1c990 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1c9a0 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1c9b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1c9c0 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
1c9d0 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
1c9e0 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
1c9f0 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
1ca00 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1ca10 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
1ca20 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
1ca30 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
1ca40 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
1ca50 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
1ca60 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
1ca70 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
1ca80 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
1ca90 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1caa0 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
1cab0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
1cac0 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
1cad0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
1cae0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1caf0 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1cb00 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
1cb10 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
1cb20 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
1cb30 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
1cb40 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
1cb50 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
1cb60 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
1cb70 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
1cb80 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
1cb90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1cba0 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
1cbb0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
1cbc0 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1cbd0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1cbe0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1cbf0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1cc00 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1cc10 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
1cc20 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
1cc30 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
1cc40 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ata;.  return SQ
1cc50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1cc60 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
1cc70 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
1cc80 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1cc90 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
1cca0 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
1ccb0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1ccc0 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
1ccd0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1cce0 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
1ccf0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1cd00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1cd10 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
1cd20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
1cd30 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
1cd40 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
1cd50 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
1cd60 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1cd70 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
1cd80 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1cd90 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
1cda0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1cdb0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1cdc0 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
1cdd0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1cde0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
1cdf0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
1ce00 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
1ce10 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
1ce20 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
1ce30 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
1ce40 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
1ce50 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
1ce60 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
1ce70 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
1ce80 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
1ce90 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
1cea0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
1ceb0 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
1cec0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
1ced0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
1cee0 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
1cef0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
1cf00 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1cf10 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
1cf20 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
1cf30 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1cf40 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
1cf50 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
1cf60 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
1cf70 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
1cf80 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
1cf90 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
1cfa0 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
1cfb0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
1cfc0 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
1cfd0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
1cfe0 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
1cff0 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
1d000 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
1d010 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
1d020 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
1d030 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1d040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d050 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1d060 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d080 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
1d090 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1d0a0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
1d0b0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
1d0c0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
1d0d0 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
1d0e0 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
1d0f0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
1d100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1d110 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
1d120 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
1d130 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
1d140 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1d150 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
1d160 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1d170 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d180 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1d190 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1d1a0 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
1d1b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d1c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1d1d0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
1d1e0 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
1d1f0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1d200 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
1d210 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
1d220 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
1d230 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
1d240 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
1d250 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
1d260 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
1d270 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
1d280 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
1d290 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
1d2a0 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
1d2b0 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
1d2c0 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
1d2d0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
1d2e0 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
1d2f0 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
1d300 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
1d310 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1d320 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1d330 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
1d340 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
1d350 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
1d360 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1d370 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
1d380 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
1d390 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1d3a0 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
1d3b0 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
1d3c0 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67   if( iGuess<=pag
1d3d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
1d3e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1d3f0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
1d400 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
1d410 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1d420 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d430 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1d440 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
1d450 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
1d460 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
1d470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1d480 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1d490 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1d4a0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
1d4b0 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
1d4c0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
1d4d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d4e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1d4f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
1d500 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b  vfl, &pPage, 0);
1d510 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
1d520 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
1d530 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
1d540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d550 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
1d560 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1d570 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
1d580 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
1d590 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
1d5a0 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
1d5b0 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
1d5c0 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
1d5d0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
1d5e0 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
1d5f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
1d600 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
1d610 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
1d620 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1d630 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
1d640 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
1d650 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
1d660 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
1d670 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
1d680 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
1d690 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
1d6a0 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
1d6b0 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
1d6c0 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
1d6d0 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
1d6e0 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
1d6f0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
1d700 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
1d710 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
1d720 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
1d730 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
1d740 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
1d750 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
1d760 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
1d770 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
1d780 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
1d790 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
1d7a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d7b0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
1d7c0 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
1d7d0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
1d7e0 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
1d7f0 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
1d800 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
1d810 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
1d820 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
1d830 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1d840 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1d850 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
1d860 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
1d870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d880 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1d890 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
1d8a0 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
1d8b0 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
1d8c0 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
1d8d0 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
1d8e0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
1d8f0 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
1d900 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
1d910 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
1d920 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
1d930 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1d940 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
1d950 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
1d960 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
1d970 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
1d980 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
1d990 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d9a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d9b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d9c0 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
1d9d0 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
1d9e0 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
1d9f0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1da00 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
1da10 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
1da20 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
1da30 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
1da40 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
1da50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1da60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1da70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1da80 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
1da90 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
1daa0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1dab0 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
1dac0 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
1dad0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1dae0 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
1daf0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
1db00 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
1db10 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
1db20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
1db30 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
1db40 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
1db50 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
1db60 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
1db70 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
1db80 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
1db90 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
1dba0 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
1dbb0 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
1dbc0 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
1dbd0 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
1dbe0 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
1dbf0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
1dc00 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
1dc10 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
1dc20 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1dc30 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
1dc40 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
1dc50 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
1dc60 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
1dc70 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73   the BtCursor.is
1dc80 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1dc90 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
1dca0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
1dcb0 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
1dcc0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
1dcd0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69  rflow pages, thi
1dce0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
1dcf0 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f  locates space fo
1dd00 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
1dd10 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  luates the overf
1dd20 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a  low page-list .*
1dd30 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  * cache array (B
1dd40 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1dd50 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63  w). Subsequent c
1dd60 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a  alls use this.**
1dd70 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
1dd80 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
1dd90 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f  pplied offset mo
1dda0 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
1ddb0 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
1ddc0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1ddd0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1dde0 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
1ddf0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
1de00 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
1de10 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
1de20 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
1de30 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
1de40 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
1de50 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
1de60 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
1de70 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
1de80 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
1de90 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
1dea0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
1deb0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1dec0 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
1ded0 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
1dee0 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
1def0 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
1df00 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
1df10 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
1df20 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
1df30 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
1df40 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
1df50 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
1df60 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
1df70 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1df80 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
1df90 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
1dfa0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
1dfb0 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
1dfc0 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
1dfd0 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
1dfe0 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
1dff0 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e010 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
1e020 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
1e030 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
1e040 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
1e050 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
1e060 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e080 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
1e090 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
1e0a0 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
1e0b0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1e0c0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1e0d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
1e0e0 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
1e0f0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1e100 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1e110 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1e120 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
1e130 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
1e140 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
1e150 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1e160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e170 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
1e180 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
1e190 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
1e1a0 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
1e1b0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1e1c0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1e1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1e1e0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1e1f0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1e200 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
1e210 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1e220 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
1e230 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1e240 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1e250 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
1e260 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
1e270 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
1e280 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
1e290 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
1e2a0 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e  .nKey);..  if( N
1e2b0 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20  EVER(offset+amt 
1e2c0 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
1e2d0 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20  o.nData) .   || 
1e2e0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
1e2f0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
1e300 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
1e310 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
1e320 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
1e330 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1e340 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
1e350 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
1e360 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
1e370 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e380 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1e390 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
1e3a0 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
1e3b0 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
1e3c0 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
1e3d0 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
1e3e0 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
1e3f0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
1e400 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1e410 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
1e420 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
1e430 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
1e440 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
1e450 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
1e460 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
1e470 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
1e480 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
1e490 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
1e4a0 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
1e4b0 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
1e4c0 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
1e4d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1e4e0 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
1e4f0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
1e500 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e510 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1e520 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
1e530 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
1e540 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
1e550 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
1e560 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
1e570 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
1e580 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
1e590 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
1e5a0 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
1e5b0 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
1e5c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e5d0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
1e5e0 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
1e5f0 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
1e600 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
1e610 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1e620 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
1e630 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1e640 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
1e650 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
1e660 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
1e670 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
1e680 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
1e690 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1e6a0 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
1e6b0 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
1e6c0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
1e6d0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
1e6e0 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
1e6f0 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
1e700 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
1e710 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
1e720 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
1e730 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
1e740 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
1e750 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
1e760 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
1e770 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
1e780 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
1e790 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1e7a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
1e7b0 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
1e7c0 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
1e7d0 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
1e7e0 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
1e7f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
1e800 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
1e810 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1e820 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
1e830 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a  nOvfl);.      /*
1e840 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73   nOvfl is always
1e850 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69   positive.  If i
1e860 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74  t were zero, fet
1e870 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20  chPayload would 
1e880 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  have.      ** be
1e890 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  en used instead 
1e8a0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  of this routine.
1e8b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
1e8c0 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21  WAYS(nOvfl) && !
1e8d0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1e8e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e8f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1e900 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1e910 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
1e920 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1e930 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1e940 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
1e950 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
1e960 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
1e970 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
1e980 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
1e990 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
1e9a0 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
1e9b0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1e9c0 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
1e9d0 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
1e9e0 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
1e9f0 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
1ea00 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
1ea10 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
1ea20 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1ea30 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
1ea40 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
1ea50 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
1ea60 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
1ea70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ea80 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
1ea90 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
1eaa0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1eab0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
1eac0 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
1ead0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
1eae0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1eaf0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
1eb00 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1eb10 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
1eb20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
1eb30 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
1eb40 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1eb50 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
1eb60 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
1eb70 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1eb80 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
1eb90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1eba0 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
1ebb0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
1ebc0 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
1ebd0 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
1ebe0 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
1ebf0 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
1ec00 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
1ec10 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
1ec20 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1ec30 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
1ec40 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
1ec50 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
1ec60 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
1ec70 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
1ec80 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
1ec90 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
1eca0 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
1ecb0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
1ecc0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1ecd0 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
1ece0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
1ecf0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1ed00 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1ed10 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
1ed20 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
1ed30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1ed40 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
1ed50 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
1ed60 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1ed70 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
1ed80 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
1ed90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
1eda0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
1edb0 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
1edc0 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
1edd0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
1ede0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
1edf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1ee00 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
1ee10 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
1ee20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
1ee30 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
1ee40 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
1ee50 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
1ee60 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
1ee70 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
1ee80 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
1ee90 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
1eea0 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  bPage;.        i
1eeb0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1eec0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1eed0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
1eee0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
1eef0 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
1ef00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ef10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ef20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
1ef30 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
1ef40 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
1ef50 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1ef60 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
1ef70 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
1ef80 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
1ef90 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
1efa0 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
1efb0 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
1efc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1efd0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
1efe0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
1eff0 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
1f000 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
1f010 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1f020 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
1f030 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1f040 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
1f050 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
1f060 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66  ;.          pBuf
1f070 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d   += a;.        }
1f080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f090 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1f0a0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1f0b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1f0c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f0d0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
1f0e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1f0f0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
1f100 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
1f110 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
1f120 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
1f130 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
1f140 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
1f150 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
1f160 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
1f170 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
1f180 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1f190 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
1f1a0 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
1f1b0 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
1f1c0 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
1f1d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1f1e0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1f1f0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
1f200 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
1f210 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
1f220 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1f230 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
1f240 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
1f250 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
1f260 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
1f270 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f280 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
1f290 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
1f2a0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
1f2b0 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
1f2c0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1f2d0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1f2e0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1f2f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1f300 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f310 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
1f320 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1f330 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
1f340 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1f350 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
1f360 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1f370 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
1f380 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
1f390 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
1f3a0 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
1f3b0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
1f3c0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
1f3d0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
1f3e0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
1f3f0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1f400 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1f410 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1f420 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1f430 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1f440 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1f450 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1f460 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1f470 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1f480 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1f490 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1f4a0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1f4b0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1f4c0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1f4d0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1f4e0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1f4f0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1f500 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
1f510 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
1f520 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
1f530 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
1f540 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
1f550 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f560 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1f570 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
1f580 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1f590 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1f5a0 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
1f5b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1f5c0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f5d0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f5e0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1f5f0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1f600 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1f610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1f620 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1f630 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1f640 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1f650 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1f660 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1f670 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1f680 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f690 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1f6a0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
1f6b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1f6c0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
1f6d0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
1f6e0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
1f6f0 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
1f700 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f710 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1f720 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
1f730 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
1f740 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
1f750 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
1f760 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
1f770 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
1f780 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
1f790 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
1f7a0 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d  key if skipKey==
1f7b0 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20  0 and it points 
1f7c0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
1f7d0 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73   of data if.** s
1f7e0 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20  kipKey==1.  The 
1f7f0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1f800 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79  of available key
1f810 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
1f820 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  .** into *pAmt. 
1f830 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
1f840 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
1f850 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
1f860 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69  e.** a valid poi
1f870 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
1f880 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
1f890 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
1f8a0 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
1f8b0 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
1f8c0 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
1f8d0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
1f8e0 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
1f8f0 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
1f900 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
1f910 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
1f920 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1f930 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
1f940 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
1f950 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
1f960 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
1f970 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
1f980 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
1f990 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
1f9a0 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
1f9b0 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
1f9c0 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
1f9d0 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
1f9e0 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
1f9f0 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
1fa00 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
1fa10 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
1fa20 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
1fa30 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
1fa40 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
1fa50 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
1fa60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1fa70 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
1fa80 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
1fa90 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
1faa0 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
1fab0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
1fac0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
1fad0 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68  gned char *fetch
1fae0 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
1faf0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1fb00 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1fb10 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
1fb20 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
1fb30 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20  t *pAmt,        
1fb40 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1fb50 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1fb60 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
1fb70 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20  /.  int skipKey 
1fb80 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64           /* read
1fb90 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61   beginning at da
1fba0 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
1fbb0 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
1fbc0 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
1fbd0 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ad;.  MemPage *p
1fbe0 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Page;.  u32 nKey
1fbf0 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a  ;.  u32 nLocal;.
1fc00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
1fc10 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
1fc20 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
1fc30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1fc40 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
1fc50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1fc60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1fc70 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1fc80 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1fc90 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1fca0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1fcb0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
1fcc0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1fcd0 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
1fce0 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45  Cell );.  if( NE
1fcf0 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  VER(pCur->info.n
1fd00 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Size==0) ){.    
1fd10 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1fd20 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1fd30 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  ->iPage], pCur->
1fd40 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1fd50 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
1fd60 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e         &pCur->in
1fd70 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c  fo);.  }.  aPayl
1fd80 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1fd90 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
1fda0 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
1fdb0 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
1fdc0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1fdd0 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
1fde0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
1fdf0 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
1fe00 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  fo.nKey;.  }.  i
1fe10 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1fe20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    aPayload += nK
1fe30 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  ey;.    nLocal =
1fe40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1fe50 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c  al - nKey;.  }el
1fe60 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
1fe70 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1fe80 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  al;.    assert( 
1fe90 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a  nLocal<=nKey );.
1fea0 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c    }.  *pAmt = nL
1feb0 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  ocal;.  return a
1fec0 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
1fed0 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
1fee0 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
1fef0 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
1ff00 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
1ff10 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
1ff20 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
1ff30 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
1ff40 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
1ff50 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
1ff60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
1ff70 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
1ff80 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
1ff90 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1ffa0 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
1ffb0 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
1ffc0 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
1ffd0 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
1ffe0 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
1fff0 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
20000 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
20010 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
20020 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
20030 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
20040 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
20050 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
20060 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
20070 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
20080 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
20090 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
200a0 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
200b0 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
200c0 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
200d0 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
200e0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
200f0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
20100 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
20110 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
20120 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
20130 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
20140 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63   int *pAmt){.  c
20150 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30  onst void *p = 0
20160 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20170 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20180 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
20190 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
201a0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
201b0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
201c0 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
201d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
201e0 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
201f0 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
20200 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
20210 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d  r, pAmt, 0);.  }
20220 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63  .  return p;.}.c
20230 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
20240 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
20250 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
20260 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63   int *pAmt){.  c
20270 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30  onst void *p = 0
20280 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20290 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
202a0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
202b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
202c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
202d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
202e0 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
202f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20300 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
20310 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
20320 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
20330 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
20340 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
20350 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
20360 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
20370 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
20380 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
20390 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
203a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
203b0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
203c0 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
203d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
203e0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
203f0 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
20400 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
20410 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
20420 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
20430 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
20440 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
20450 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
20460 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
20470 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
20480 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
20490 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
204a0 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
204b0 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
204c0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
204d0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
204e0 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
204f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
20500 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  i = pCur->iPage;
20510 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
20520 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
20530 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
20540 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
20550 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20560 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
20570 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
20580 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
20590 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
205a0 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
205b0 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66  AX_DEPTH );.  if
205c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
205d0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
205e0 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
205f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20600 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
20610 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
20620 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
20630 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69   &pNewPage);.  i
20640 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
20650 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
20660 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
20670 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
20680 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
20690 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
206a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
206b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
206c0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
206d0 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
206e0 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d  l<1 || pNewPage-
206f0 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61  >intKey!=pCur->a
20700 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79  pPage[i]->intKey
20710 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
20720 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
20730 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
20740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
20750 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
20760 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
20770 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
20780 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
20790 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
207a0 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
207b0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
207c0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
207d0 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
207e0 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
207f0 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
20800 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
20810 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
20820 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
20830 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
20840 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
20850 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
20860 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
20870 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
20880 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
20890 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
208a0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
208b0 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
208c0 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72  iChild){.  asser
208d0 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
208e0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
208f0 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
20900 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
20910 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
20920 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
20930 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
20940 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
20950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
20960 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
20970 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
20980 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
20990 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
209a0 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
209b0 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
209c0 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
209d0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
209e0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
209f0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
20a00 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
20a10 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
20a20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
20a30 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
20a40 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
20a50 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
20a60 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
20a70 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
20a80 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
20a90 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
20aa0 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
20ab0 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
20ac0 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
20ad0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
20ae0 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
20af0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
20b00 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
20b10 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
20b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
20b30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
20b40 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
20b50 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
20b60 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
20b70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
20b80 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
20b90 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
20ba0 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
20bb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
20bc0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
20bd0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20be0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
20bf0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20c00 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
20c10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
20c20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20c30 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
20c40 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
20c50 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
20c60 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
20c70 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
20c80 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
20c90 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
20ca0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
20cb0 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
20cc0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
20cd0 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
20ce0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
20cf0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
20d00 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
20d10 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
20d20 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
20d30 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
20d40 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
20d50 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
20d60 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
20d70 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
20d80 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
20d90 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
20da0 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
20db0 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
20dc0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
20dd0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
20de0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
20df0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
20e00 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
20e10 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
20e20 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
20e30 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
20e40 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
20e50 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
20e60 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
20e70 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
20e80 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
20e90 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
20ea0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
20eb0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
20ec0 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
20ed0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
20ee0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
20ef0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
20f00 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
20f10 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
20f20 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
20f30 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
20f40 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
20f50 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
20f60 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
20f70 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
20f80 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
20f90 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
20fa0 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
20fb0 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
20fc0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
20fd0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
20fe0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
20ff0 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
21000 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
21010 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
21020 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
21030 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
21040 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
21050 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
21060 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
21070 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
21080 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
21090 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
210a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
210b0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
210c0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
210d0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
210e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
210f0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
21100 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
21110 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21120 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
21130 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21140 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
21150 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
21160 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
21170 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
21180 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
21190 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
211a0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
211b0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
211c0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
211d0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
211e0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
211f0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
21200 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
21210 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21220 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
21230 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
21240 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
21250 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65  E_OK );.      re
21260 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
21270 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
21280 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
21290 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
212a0 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
212b0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
212c0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
212d0 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  1; i<=pCur->iPag
212e0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
212f0 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
21300 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
21310 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
21320 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ge = 0;.  }else{
21330 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
21340 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
21350 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
21360 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b  Cur->apPage[0]);
21370 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21390 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
213a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
213b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
213c0 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
213d0 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  iPage = 0;..    
213e0 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
213f0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
21400 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
21410 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
21420 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a  is cursor.    **
21430 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
21440 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
21450 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
21460 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
21470 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20  is.    ** NULL, 
21480 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
21490 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
214a0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
214b0 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20  t the case,.    
214c0 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
214d0 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
214e0 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  r.  */.    asser
214f0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
21500 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  0]->intKey==1 ||
21510 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
21520 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
21530 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b     if( (pCur->pK
21540 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72  eyInfo==0)!=pCur
21550 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
21560 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
21570 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21580 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
21590 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20   }..  /* Assert 
215a0 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61  that the root pa
215b0 67 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ge is of the cor
215c0 72 65 63 74 20 74 79 70 65 2e 20 54 68 69 73 20  rect type. This 
215d0 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a  must be the.  **
215e0 20 63 61 73 65 20 61 73 20 74 68 65 20 63 61 6c   case as the cal
215f0 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
21600 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74  on that loaded t
21610 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69  he root-page (ei
21620 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63  ther.  ** this c
21630 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75  all or a previou
21640 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f  s invocation) wo
21650 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
21660 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20  d corruption .  
21670 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d 70  ** if the assump
21680 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
21690 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  ue, and it is no
216a0 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
216b0 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62  he flags .  ** b
216c0 79 74 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e  yte to have been
216d0 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20   modified while 
216e0 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 68  this cursor is h
216f0 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
21700 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70  ce.  ** to the p
21710 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74  age.  */.  pRoot
21720 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
21730 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
21740 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
21750 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61  >pgnoRoot );.  a
21760 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73  ssert( pRoot->is
21770 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70  Init && (pCur->p
21780 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f  KeyInfo==0)==pRo
21790 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20  ot->intKey );.. 
217a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
217b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
217c0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
217d0 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
217e0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
217f0 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ey = 0;..  if( p
21800 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
21810 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
21820 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
21830 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
21840 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
21850 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21860 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
21870 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
21880 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
21890 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
218a0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
218b0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
218c0 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
218d0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
218e0 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
218f0 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
21900 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e  ate = ((pRoot->n
21910 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
21920 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
21930 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LID);.  }.  retu
21940 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21950 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
21960 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
21970 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
21980 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
21990 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
219a0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
219b0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
219c0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
219d0 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
219e0 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
219f0 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
21a00 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
21a10 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
21a20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
21a30 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
21a40 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
21a50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21a60 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
21a70 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
21a80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21a90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21aa0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21ab0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21ac0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
21ad0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21ae0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
21af0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21b00 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
21b10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21b20 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21b30 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
21b40 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
21b50 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
21b60 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
21b70 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
21b80 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
21b90 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
21ba0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
21bb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
21bc0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
21bd0 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
21be0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
21bf0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
21c00 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
21c10 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
21c20 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
21c30 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
21c40 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
21c50 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
21c60 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
21c70 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
21c80 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
21c90 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
21ca0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
21cb0 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
21cc0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
21cd0 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
21ce0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
21cf0 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
21d00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
21d10 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
21d20 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
21d30 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
21d40 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
21d50 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
21d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21d70 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
21d80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
21d90 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
21da0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21db0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
21dc0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
21dd0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21de0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21df0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
21e00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21e10 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
21e20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21e30 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
21e40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21e50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
21e60 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
21e70 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
21e80 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
21e90 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
21ea0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
21eb0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
21ec0 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
21ed0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
21ee0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
21ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21f00 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
21f10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
21f20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
21f30 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
21f40 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
21f50 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
21f60 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
21f70 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
21f80 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
21f90 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
21fa0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
21fb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
21fc0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
21fd0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
21fe0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
21ff0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
22000 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
22010 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
22020 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
22030 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
22040 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
22050 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
22060 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
22070 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
22080 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22090 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
220a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
220b0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
220c0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
220d0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
220e0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
220f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22100 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
22110 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
22120 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
22130 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22140 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22150 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
22160 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
22170 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22180 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
22190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
221a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
221b0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
221c0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
221d0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
221e0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
221f0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
22200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22210 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
22220 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
22230 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
22240 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
22250 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
22260 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
22270 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
22280 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
22290 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
222a0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
222b0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
222c0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
222d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
222e0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
222f0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
22300 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
22310 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22320 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22330 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
22340 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
22350 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
22360 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
22370 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
22380 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
22390 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
223a0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
223b0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
223c0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
223d0 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73  e && pCur->atLas
223e0 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  t ){.#ifdef SQLI
223f0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
22400 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
22410 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
22420 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
22430 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
22440 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
22450 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
22460 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
22470 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
22480 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
22490 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
224a0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
224b0 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
224c0 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
224d0 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
224e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
224f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22500 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
22510 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22520 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
22530 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
22540 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
22550 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
22560 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22570 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
22580 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
22590 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
225a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
225b0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
225c0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
225d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
225e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
225f0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
22600 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
22610 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
22620 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
22630 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22640 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
22650 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
22660 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
22670 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
22680 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
22690 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
226a0 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d  E_OK ?1:0;.    }
226b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
226c0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
226d0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
226e0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
226f0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
22700 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
22710 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
22720 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
22730 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
22740 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
22750 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
22760 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
22770 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
22780 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
22790 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
227a0 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
227b0 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
227c0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
227d0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
227e0 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
227f0 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
22800 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
22810 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
22820 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
22830 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
22840 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
22850 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
22860 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
22870 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
22880 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
22890 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
228a0 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
228b0 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
228c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
228d0 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
228e0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
228f0 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
22900 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
22910 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
22920 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
22930 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
22940 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
22950 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
22960 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
22970 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
22980 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
22990 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
229a0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
229b0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
229c0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
229d0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
229e0 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
229f0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
22a00 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
22a10 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
22a20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
22a30 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
22a40 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
22a50 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
22a60 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
22a70 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
22a80 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
22a90 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
22aa0 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
22ab0 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
22ac0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
22ad0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
22ae0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
22af0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
22b00 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
22b10 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
22b20 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
22b30 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
22b40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22b50 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
22b60 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
22b70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
22b80 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
22b90 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
22ba0 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
22bb0 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
22bc0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
22bd0 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
22be0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
22bf0 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
22c00 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
22c10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
22c20 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
22c30 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
22c40 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c60 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
22c70 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
22c80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
22c90 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
22ca0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
22cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
22cc0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
22cd0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
22ce0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
22cf0 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
22d00 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
22d10 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
22d20 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Info==0) );..  /
22d30 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
22d40 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
22d50 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
22d60 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
22d70 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
22d80 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
22d90 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
22da0 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
22db0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
22dc0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
22dd0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
22de0 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70   .   && pCur->ap
22df0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
22e00 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
22e10 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
22e20 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
22e30 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
22e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22e50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22e60 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20  pCur->atLast && 
22e70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
22e80 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
22e90 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
22ea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22eb0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
22ec0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
22ed0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
22ee0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22ef0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
22f00 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22f10 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
22f20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22f30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22f40 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  ]->isInit );.  a
22f50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22f60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22f70 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75  ->nCell>0 || pCu
22f80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22f90 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69  R_INVALID );.  i
22fa0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
22fb0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
22fc0 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
22fd0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
22fe0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22ff0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
23000 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
23010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
23020 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23030 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
23040 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
23050 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
23060 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
23070 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
23080 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
23090 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
230a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
230b0 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a    int c;..    /*
230c0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
230d0 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
230e0 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
230f0 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
23100 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
23110 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
23120 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
23130 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
23140 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
23150 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
23160 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
23170 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
23180 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
23190 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
231a0 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
231b0 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
231c0 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
231d0 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
231e0 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
231f0 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
23200 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
23210 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
23220 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
23230 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
23240 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
23250 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
23260 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
23270 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
23280 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
23290 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
232a0 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
232b0 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
232c0 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
232d0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
232e0 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67  .    if( biasRig
232f0 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ht ){.      pCur
23300 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23310 61 67 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b  age] = (u16)upr;
23320 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23330 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
23340 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
23350 36 29 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b  6)((upr+lwr)/2);
23360 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b  .    }.    for(;
23370 3b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  ;){.      int id
23380 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
23390 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
233a0 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
233b0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
233c0 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  */.      u8 *pCe
233d0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
233f0 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
23400 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
23410 20 2a 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d   */..      pCur-
23420 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23430 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  .      pCell = f
23440 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
23450 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
23460 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
23470 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
23480 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  ey ){.        i6
23490 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
234a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
234b0 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
234c0 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
234d0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
234e0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
234f0 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  ell, dummy);.   
23500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
23510 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
23520 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
23530 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
23540 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
23550 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
23560 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
23570 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
23580 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
23590 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
235a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
235b0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
235c0 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  Key>intKey );.  
235d0 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
235e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
235f0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
23600 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
23610 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
23620 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
23630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23640 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
23650 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
23660 7a 65 20 69 73 20 33 32 37 36 38 20 62 79 74 65  ze is 32768 byte
23670 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
23680 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
23690 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
236a0 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
236b0 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
236c0 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
236d0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 61 74     ** page is at
236e0 20 6d 6f 73 74 20 38 31 39 38 20 62 79 74 65 73   most 8198 bytes
236f0 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73  , which may be s
23700 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
23710 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
23720 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
23730 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
23740 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
23750 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
23760 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
23770 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
23780 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
23790 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
237a0 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
237b0 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
237c0 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
237d0 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
237e0 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
237f0 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
23800 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
23810 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
23820 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70     int nCell = p
23830 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
23840 20 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30   if( !(nCell & 0
23850 78 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70  x80) && nCell<=p
23860 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
23870 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
23880 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
23890 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
238a0 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
238b0 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
238c0 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
238d0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
238e0 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
238f0 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
23900 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
23910 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
23920 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
23930 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
23940 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
23950 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
23960 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
23970 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
23980 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
23990 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
239a0 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
239b0 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
239c0 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
239d0 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b  Local.        ){
239e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
239f0 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
23a00 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
23a10 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
23a20 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
23a30 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
23a40 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
23a50 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
23a60 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
23a70 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
23a80 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
23a90 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
23aa0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
23ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23ac0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
23ad0 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
23ae0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
23af0 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
23b00 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
23b10 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
23b20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
23b30 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
23b40 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
23b50 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
23b60 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
23b70 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
23b80 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
23b90 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
23ba0 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
23bb0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
23bc0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
23bd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
23be0 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
23bf0 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
23c00 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
23c10 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
23c20 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
23c30 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
23c40 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
23c50 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
23c60 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
23c70 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
23c80 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
23c90 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
23ca0 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
23cb0 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  c( nCell );.    
23cc0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
23cd0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
23ce0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23cf0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
23d00 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
23d10 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
23d20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
23d30 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
23d40 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
23d50 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
23d60 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20  )pCellKey, 0);. 
23d70 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
23d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
23d90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
23da0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
23db0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
23dc0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
23dd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
23de0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
23df0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
23e00 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
23e10 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
23e20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
23e30 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
23e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23e50 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
23e60 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
23e70 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
23e80 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
23e90 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
23ea0 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
23eb0 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
23ec0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
23ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23ee0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
23ef0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23f00 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
23f10 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
23f20 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
23f30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
23f40 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
23f50 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
23f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23f70 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
23f80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
23f90 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
23fa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
23fb0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
23fc0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
23fd0 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70 72  = (u16)((lwr+upr
23fe0 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
23ff0 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
24000 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
24010 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
24020 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
24030 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
24040 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
24050 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
24060 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
24070 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
24080 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
24090 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
240a0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
240b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
240c0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
240d0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
240e0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
240f0 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
24100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
24110 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24120 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
24130 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24140 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
24150 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
24160 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
24170 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
24180 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
24190 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
241a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
241b0 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70   (u16)lwr;.    p
241c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
241d0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
241e0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
241f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
24200 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
24210 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
24220 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
24230 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  h;.  }.moveto_fi
24240 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72  nish:.  return r
24250 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
24260 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
24270 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
24280 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
24290 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
242a0 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
242b0 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
242c0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
242d0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
242e0 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
242f0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
24300 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
24310 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
24320 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
24330 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
24340 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
24350 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
24360 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
24370 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24380 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
24390 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
243a0 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
243b0 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
243c0 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
243d0 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
243e0 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
243f0 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
24400 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
24410 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
24420 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
24430 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
24440 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
24450 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
24460 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
24470 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
24480 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
24490 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
244a0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
244b0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
244c0 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
244d0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
244e0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
244f0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
24500 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
24510 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
24520 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24530 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
24540 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
24550 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
24560 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
24570 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
24580 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
24590 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
245a0 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
245b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
245c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
245d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
245e0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
245f0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
24600 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
24610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24620 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24630 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
24640 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43  es!=0 );.  if( C
24650 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
24660 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
24670 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
24680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24690 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
246a0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
246b0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
246c0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Next = 0;.    *p
246d0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
246e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
246f0 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e   }.  pCur->skipN
24700 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  ext = 0;..  pPag
24710 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
24720 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
24730 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
24740 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24750 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
24760 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
24770 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61  assert( idx<=pPa
24780 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
24790 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
247a0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
247b0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
247c0 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
247d0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
247e0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
247f0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
24800 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
24810 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
24820 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
24830 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
24840 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
24850 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
24860 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
24870 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
24880 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
24890 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
248a0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
248b0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
248c0 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
248d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
248e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
248f0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
24900 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24910 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
24920 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
24930 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
24940 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
24950 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
24960 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
24970 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24980 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
24990 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
249a0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
249b0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
249c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
249d0 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
249e0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
249f0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
24a00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
24a10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24a20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
24a30 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
24a40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
24a50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
24a60 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
24a70 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
24a80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
24a90 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
24aa0 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
24ab0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
24ac0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
24ad0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
24ae0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
24af0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
24b00 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
24b10 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
24b20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
24b30 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
24b40 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
24b50 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
24b60 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
24b70 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
24b80 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
24b90 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
24ba0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
24bb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
24bc0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
24bd0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24be0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24bf0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
24c00 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
24c10 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
24c20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24c30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24c40 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
24c50 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  0;.  if( CURSOR_
24c60 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
24c70 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
24c80 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
24c90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24ca0 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
24cb0 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
24cc0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
24cd0 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
24ce0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
24cf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
24d00 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
24d10 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
24d20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24d30 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
24d40 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
24d50 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
24d60 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
24d70 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
24d80 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24d90 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
24da0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
24db0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
24dc0 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
24dd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24df0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
24e00 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
24e10 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24e20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
24e30 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
24e40 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
24e50 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
24e60 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
24e70 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24e80 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
24e90 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
24ea0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24eb0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
24ec0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
24ed0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
24ee0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
24ef0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
24f00 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
24f10 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
24f20 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
24f30 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
24f40 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24f50 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
24f60 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
24f70 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
24f80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24f90 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
24fa0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
24fb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24fc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24fd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
24fe0 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
24ff0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
25000 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
25010 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
25020 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
25030 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
25040 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
25050 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
25060 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
25070 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
25080 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
25090 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
250a0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
250b0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
250c0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
250d0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
250e0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
250f0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
25100 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
25110 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
25120 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
25130 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
25140 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
25150 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
25160 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
25170 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
25180 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
25190 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
251a0 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
251b0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
251c0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
251d0 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
251e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
251f0 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
25200 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
25210 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
25220 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
25230 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
25240 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
25250 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
25260 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
25270 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
25280 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
25290 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
252a0 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
252b0 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
252c0 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
252d0 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
252e0 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
252f0 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
25300 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
25310 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
25320 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
25330 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
25340 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
25350 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
25360 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
25370 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
25380 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
25390 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
253a0 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
253b0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
253c0 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
253d0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
253e0 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
253f0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
25400 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
25410 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
25420 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
25430 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
25440 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
25450 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
25460 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
25470 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
25480 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
25490 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
254a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
254b0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
254c0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
254d0 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
254e0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
254f0 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
25500 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
25510 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
25520 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
25530 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
25540 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
25550 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
25560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25570 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
25580 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25590 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
255a0 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
255b0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
255c0 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
255d0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d  ount(pBt);.  n =
255e0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
255f0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
25600 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
25610 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
25620 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
25630 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25640 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
25650 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
25660 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
25670 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
25680 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
25690 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
256a0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
256b0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
256c0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
256d0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
256e0 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
256f0 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
25700 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
25710 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
25720 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
25730 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
25740 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
25750 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
25760 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
25770 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
25780 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
25790 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
257a0 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
257b0 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
257c0 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
257d0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
257e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
257f0 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
25800 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61   && nearby<=mxPa
25810 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  ge ){.      u8 e
25820 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
25830 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
25840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
25850 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
25860 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
25870 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
25880 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
25890 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
258a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
258b0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
258c0 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
258d0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
258e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
258f0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
25900 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
25910 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
25920 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
25930 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
25940 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
25950 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
25960 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
25970 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
25980 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
25990 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
259a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
259b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
259c0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
259d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
259e0 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
259f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
25a00 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
25a10 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
25a20 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
25a30 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
25a40 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
25a50 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
25a60 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
25a70 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
25a80 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
25a90 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
25aa0 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
25ab0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
25ac0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
25ad0 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
25ae0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
25af0 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
25b00 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
25b10 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
25b20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
25b30 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
25b40 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
25b50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25b60 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
25b70 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
25b80 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
25b90 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
25ba0 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
25bb0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
25bc0 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
25bd0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25be0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25bf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25c00 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
25c10 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
25c20 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
25c30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25c40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
25c50 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
25c60 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
25c70 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
25c80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d      }..      k =
25c90 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
25ca0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
25cb0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
25cc0 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
25cd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
25ce0 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
25cf0 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
25d00 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
25d10 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
25d20 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
25d30 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
25d40 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
25d50 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
25d60 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
25d70 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
25d80 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
25d90 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
25da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25db0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
25dc0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
25dd0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
25de0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
25df0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
25e00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25e10 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
25e20 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
25e30 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
25e40 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
25e50 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
25e60 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
25e70 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
25e80 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
25e90 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
25ea0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
25eb0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
25ec0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
25ed0 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
25ee0 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
25ef0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
25f00 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
25f10 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
25f20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
25f30 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
25f40 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
25f50 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
25f60 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
25f70 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25f80 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
25f90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
25fa0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
25fb0 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
25fc0 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72  t && nearby==iTr
25fd0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
25fe0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
25ff0 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
26000 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
26010 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
26020 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
26030 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
26040 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
26050 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
26060 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
26070 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72  ert( *pPgno==iTr
26080 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  unk );.        *
26090 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
260a0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
260b0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
260c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
260d0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
260e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
260f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
26100 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
26110 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
26120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26130 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
26140 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
26150 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
26160 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
26170 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
26180 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
26190 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
261a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
261b0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
261c0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
261d0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
261e0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
261f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
26200 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
26210 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
26220 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
26230 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
26240 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
26250 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
26260 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
26270 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
26280 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
26290 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
262a0 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
262b0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
262c0 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
262d0 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
262e0 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
262f0 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
26300 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
26310 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
26320 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
26330 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
26340 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26350 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26360 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
26370 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26380 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
26390 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
263a0 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
263b0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
263c0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
263d0 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
263e0 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
263f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
26400 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26410 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
26420 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
26430 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
26440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
26450 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26460 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
26470 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
26480 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
264a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
264b0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
264c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
264d0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
264e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
264f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
26500 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
26510 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
26520 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
26530 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
26540 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
26550 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
26560 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
26570 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
26580 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
26590 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
265a0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
265b0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
265c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
265d0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
265e0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
265f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
26600 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
26610 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
26620 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
26630 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
26640 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
26650 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
26660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26680 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
26690 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
266a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
266b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
266c0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
266d0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
266e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
266f0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
26700 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
26710 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
26720 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26730 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
26740 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
26750 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
26760 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
26770 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
26780 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
26790 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
267a0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
267b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
267c0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
267d0 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
267e0 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
267f0 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
26800 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
26810 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
26820 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
26830 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63  Data;.        rc
26840 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26850 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
26860 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
26870 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
26880 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
26890 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
268a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
268b0 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
268c0 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
268d0 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
268e0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
268f0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
26900 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79     dist = get4by
26910 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
26920 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
26930 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64    if( dist<0 ) d
26940 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20  ist = -dist;.   
26950 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
26960 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
26970 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
26980 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
26990 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
269a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
269b0 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64  ( d2<0 ) d2 = -d
269c0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  2;.            i
269d0 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
269e0 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
269f0 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
26a00 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
26a10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26a20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26a40 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
26a50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
26a60 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
26a70 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
26a80 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
26a90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
26aa0 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
26ab0 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
26ac0 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
26ad0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26ae0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
26af0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
26b00 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
26b10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26b20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
26b30 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
26b40 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
26b50 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d  hList || iPage==
26b60 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
26b70 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
26b80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
26b90 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
26ba0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
26bb0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
26bc0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
26bd0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
26be0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
26bf0 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
26c00 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
26c10 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
26c20 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
26c30 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
26c40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26c50 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
26c60 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
26c70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
26c80 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
26c90 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
26ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26cb0 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
26cc0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
26cd0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
26ce0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
26cf0 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ble(pTrunk->pDbP
26d00 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
26d10 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
26d20 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
26d30 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a  t(pBt, *pPgno);.
26d40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
26d50 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
26d60 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
26d70 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
26d80 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
26d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26da0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26db0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
26dc0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
26dd0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26de0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26df0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
26e00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
26e10 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
26e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26e30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
26e40 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
26e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26e60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
26e70 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
26e80 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
26e90 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
26ea0 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
26eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
26ec0 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
26ed0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
26ee0 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65  , so create a ne
26ef0 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20  w page at the.  
26f00 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
26f10 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  file */.    rc =
26f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26f30 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
26f40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
26f50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
26f60 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
26f70 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
26f80 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
26f90 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
26fa0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
26fb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26fc0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
26fd0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
26fe0 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
26ff0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
27000 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
27010 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
27020 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
27030 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
27040 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
27050 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
27060 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
27070 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
27080 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
27090 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
270a0 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
270b0 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
270c0 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
270d0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
270e0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
270f0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
27100 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
27110 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
27120 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
27130 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
27140 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
27150 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
27160 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
27170 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
27180 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
27190 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
271a0 74 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  tPage(pBt, pBt->
271b0 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 31 29 3b  nPage, &pPg, 1);
271c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
271d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
271e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
271f0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e  PagerWrite(pPg->
27200 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
27210 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
27220 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
27230 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
27240 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d  n rc;.      pBt-
27250 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
27260 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
27270 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
27280 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e  E(pBt) ){ pBt->n
27290 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a  Page++; }.    }.
272a0 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62  #endif.    put4b
272b0 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42  yte(28 + (u8*)pB
272c0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
272d0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
272e0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d     *pPgno = pBt-
272f0 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73  >nPage;..    ass
27300 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
27310 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
27320 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
27330 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
27340 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
27350 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 1);.    if( rc
27360 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27380 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
27390 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
273a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
273b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
273c0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
273d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
273e0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
273f0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
27400 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
27410 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
27420 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
27430 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
27440 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
27450 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
27460 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
27470 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
27480 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63  Trunk);.  if( rc
27490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
274a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
274b0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
274c0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
274d0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
274e0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
274f0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
27500 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27510 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
27520 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
27530 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
27540 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
27550 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27560 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
27570 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
27580 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
27590 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
275a0 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
275b0 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
275c0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
275d0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
275e0 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
275f0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
27600 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
27610 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
27620 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
27630 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
27640 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
27650 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
27660 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
27670 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
27680 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
27690 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
276a0 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
276b0 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
276c0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
276d0 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
276e0 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
276f0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
27700 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
27710 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
27720 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
27730 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
27740 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
27750 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
27760 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
27770 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
27780 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
27790 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
277a0 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
277b0 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
277c0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
277d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
277e0 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
277f0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
27800 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
27810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27820 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
27830 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
27840 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
27850 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
27860 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
27870 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
27880 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
27890 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
278a0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
278b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
278c0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
278d0 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
278e0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27910 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
27920 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27940 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
27950 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
27960 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
27970 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27980 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
27990 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
279a0 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
279b0 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
279c0 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
279d0 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
279e0 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
279f0 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
27a00 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
27a10 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
27a20 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
27a30 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
27a40 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
27a50 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
27a60 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
27a70 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
27a80 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
27a90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27aa0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
27ab0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
27ac0 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
27ad0 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
27ae0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
27af0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
27b00 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
27b10 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
27b20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28  nFree+1);..  if(
27b30 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65   pBt->secureDele
27b40 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  te ){.    /* If 
27b50 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
27b60 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
27b70 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
27b80 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
27b90 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
27ba0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
27bb0 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
27bc0 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26     if( (!pPage &
27bd0 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65  & ((rc = btreeGe
27be0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
27bf0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30  , &pPage, 0))!=0
27c00 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20  ) ).     ||     
27c10 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71         ((rc = sq
27c20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27c30 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
27c40 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
27c50 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
27c60 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
27c70 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
27c80 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
27c90 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
27ca0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
27cb0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
27cc0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
27cd0 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
27ce0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
27cf0 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
27d00 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
27d10 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
27d20 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
27d30 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
27d40 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
27d50 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
27d60 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
27d70 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
27d80 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
27d90 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
27da0 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
27db0 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
27dc0 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
27dd0 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
27de0 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
27df0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
27e00 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
27e10 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
27e20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
27e30 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
27e40 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
27e50 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
27e60 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
27e70 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
27e80 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
27e90 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
27ea0 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
27eb0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
27ec0 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
27ed0 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
27ee0 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
27ef0 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
27f00 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
27f10 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
27f20 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
27f30 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
27f40 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
27f50 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
27f60 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
27f70 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
27f80 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
27f90 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
27fa0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
27fb0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
27fc0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
27fd0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
27fe0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
27ff0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
28000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28010 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
28020 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
28030 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
28040 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
28050 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28060 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
28070 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
28080 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
28090 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
280a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
280b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
280c0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
280d0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
280e0 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
280f0 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
28100 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
28110 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
28120 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
28130 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
28140 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
28150 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
28160 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
28170 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
28180 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
28190 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
281a0 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
281b0 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
281c0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
281d0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
281e0 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
281f0 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
28200 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
28210 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
28220 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
28230 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
28240 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
28250 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
28260 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
28270 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
28280 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
28290 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
282a0 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
282b0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
282c0 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
282d0 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
282e0 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
282f0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
28300 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
28310 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
28320 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
28330 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
28340 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
28350 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
28360 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
28370 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
28380 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
28390 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
283a0 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
283b0 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
283c0 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
283d0 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
283e0 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
283f0 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
28400 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
28410 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
28420 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
28430 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
28440 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
28450 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
28460 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
28470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28480 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
28490 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
284a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
284b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
284c0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
284d0 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
284e0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
284f0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
28500 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
28510 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
28520 69 66 28 20 70 50 61 67 65 20 26 26 20 21 70 42  if( pPage && !pB
28530 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
28540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
28550 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
28560 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
28570 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
28580 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
28590 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
285a0 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
285b0 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
285c0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
285d0 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
285e0 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
285f0 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
28600 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
28610 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
28620 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
28630 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
28640 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
28650 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
28660 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
28670 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
28680 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
28690 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
286a0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
286b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
286c0 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
286d0 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
286e0 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
286f0 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
28700 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
28710 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
28720 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
28730 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
28740 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
28750 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
28760 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
28770 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
28780 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
28790 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  */.  if( pPage==
287a0 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 && SQLITE_OK!=
287b0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
287c0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
287d0 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20  pPage, 0)) ){.  
287e0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
287f0 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  out;.  }.  rc = 
28800 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28810 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
28820 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
28830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
28840 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
28850 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
28860 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
28870 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
28880 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
28890 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
288a0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
288b0 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
288c0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
288d0 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
288e0 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
288f0 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
28900 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
28910 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
28920 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
28930 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
28940 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
28950 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
28960 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
28970 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
28980 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
28990 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
289a0 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43  *pPage, int *pRC
289b0 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
289c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
289d0 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67    *pRC = freePag
289e0 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
289f0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
28a00 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
28a10 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
28a20 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
28a30 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
28a40 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  en Cell..*/.stat
28a50 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
28a60 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
28a70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
28a80 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72  pCell){.  BtShar
28a90 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
28aa0 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  >pBt;.  CellInfo
28ab0 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76   info;.  Pgno ov
28ac0 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
28ad0 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
28ae0 20 75 31 36 20 6f 76 66 6c 50 61 67 65 53 69 7a   u16 ovflPageSiz
28af0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
28b00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
28b10 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
28b20 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61  ex) );.  btreePa
28b30 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
28b40 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
28b50 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
28b60 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  rflow==0 ){.    
28b70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28b80 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f  ;  /* No overflo
28b90 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  w pages. Return 
28ba0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
28bb0 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20  ything */.  }.  
28bc0 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
28bd0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
28be0 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
28bf0 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
28c00 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
28c10 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
28c20 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
28c30 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
28c40 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
28c50 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
28c60 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
28c70 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
28c80 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
28c90 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
28ca0 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
28cb0 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
28cc0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
28cd0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
28ce0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
28cf0 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
28d00 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
28d10 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
28d20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
28d30 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
28d40 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
28d50 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
28d60 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
28d70 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
28d80 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
28d90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
28da0 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
28db0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
28dc0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
28dd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28de0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
28df0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
28e00 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
28e10 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
28e20 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
28e30 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
28e40 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
28e50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
28e60 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
28e70 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
28e80 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
28e90 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
28ea0 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
28eb0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
28ec0 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
28ed0 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
28ee0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
28ef0 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
28f00 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
28f10 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
28f20 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
28f30 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
28f40 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
28f50 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
28f60 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
28f70 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
28f80 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
28f90 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
28fa0 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
28fb0 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
28fc0 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
28fd0 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
28fe0 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
28ff0 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
29000 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
29010 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
29020 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
29030 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
29040 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
29050 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
29060 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
29070 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
29080 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
29090 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
290a0 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
290b0 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
290c0 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
290d0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
290e0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
290f0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
29100 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
29110 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
29120 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
29130 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
29140 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
29150 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
29160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
29170 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
29180 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
29190 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
291a0 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
291b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
291c0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
291d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
291e0 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
291f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
29200 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29210 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
29220 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
29230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29240 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
29250 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
29260 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
29270 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
29280 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
29290 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
292a0 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
292b0 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
292c0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
292d0 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
292e0 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
292f0 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
29300 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
29310 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
29320 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
29330 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
29340 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
29350 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
29360 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
29370 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
29380 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
29390 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
293a0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
293b0 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
293c0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
293d0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
293e0 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
293f0 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
29400 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
29410 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
29420 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
29430 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
29440 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29450 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
29460 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29480 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
29490 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
294a0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
294b0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
294c0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
294d0 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
294e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
294f0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
29500 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
29510 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
29520 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
29530 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
29540 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29560 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
29570 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
29580 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
29590 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
295a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
295b0 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
295c0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
295d0 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
295e0 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
295f0 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
29600 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
29610 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
29620 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
29630 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
29640 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
29650 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
29660 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
29670 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
29680 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
29690 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
296a0 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
296b0 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
296c0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
296d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
296e0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
296f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
29700 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
29710 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
29720 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
29730 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
29740 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
29750 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
29760 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
29770 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
29780 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
29790 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
297a0 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
297b0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
297c0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
297d0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
297e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
297f0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
29800 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
29810 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
29820 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
29830 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
29840 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
29850 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
29860 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
29870 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
29880 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
29890 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
298a0 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
298b0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
298c0 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
298d0 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
298e0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
298f0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
29900 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65  )&nKey);.  btree
29910 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
29920 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
29930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
29940 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64  o.nHeader==nHead
29950 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
29960 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
29970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
29980 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e  o.nData==(u32)(n
29990 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20  Data+nZero) );. 
299a0 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
299b0 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
299c0 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
299d0 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
299e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
299f0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
29a00 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
29a10 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
29a20 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
29a30 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
29a40 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
29a50 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
29a60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
29a70 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
29a80 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
29a90 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
29aa0 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
29ab0 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
29ac0 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
29ad0 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
29ae0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
29af0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
29b00 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
29b10 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
29b20 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
29b30 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
29b40 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
29b50 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
29b60 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
29b70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29b80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
29b90 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
29ba0 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
29bb0 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
29bc0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
29bd0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
29be0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
29bf0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
29c00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
29c10 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
29c20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
29c30 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
29c40 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
29c50 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
29c60 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
29c70 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
29c80 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
29c90 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
29ca0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
29cb0 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
29cc0 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
29cd0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
29ce0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
29cf0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
29d00 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
29d10 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
29d20 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
29d30 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
29d40 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
29d50 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
29d60 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
29d70 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
29d80 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
29d90 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
29da0 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
29db0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
29dc0 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
29dd0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
29de0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
29df0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
29e00 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
29e10 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
29e20 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
29e30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
29e40 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
29e50 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
29e60 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
29e70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
29e80 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
29e90 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
29ea0 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
29eb0 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
29ec0 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
29ed0 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
29ee0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
29ef0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
29f00 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
29f10 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
29f20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29f30 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
29f40 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
29f50 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
29f60 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
29f70 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
29f80 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
29f90 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
29fa0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
29fb0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
29fc0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
29fd0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
29fe0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
29ff0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2a000 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2a010 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2a020 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2a030 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2a040 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
2a050 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
2a060 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
2a070 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2a080 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
2a090 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
2a0a0 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
2a0b0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
2a0c0 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
2a0d0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2a0e0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2a0f0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2a100 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2a110 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2a120 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
2a130 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2a140 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2a150 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2a160 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
2a170 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2a180 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
2a190 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
2a1a0 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
2a1b0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2a1c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2a1d0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2a1e0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2a1f0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2a200 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
2a210 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2a220 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
2a230 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2a240 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
2a250 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
2a260 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
2a270 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
2a280 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2a290 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
2a2a0 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
2a2b0 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
2a2c0 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
2a2d0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2a2e0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
2a2f0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
2a300 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
2a310 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
2a320 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
2a330 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2a340 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
2a350 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
2a360 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2a370 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2a380 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
2a390 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
2a3a0 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
2a3b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
2a3c0 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
2a3d0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2a3e0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
2a3f0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2a400 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
2a410 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
2a420 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
2a430 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
2a440 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
2a450 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2a460 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
2a470 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
2a480 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
2a490 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
2a4a0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2a4b0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2a4c0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2a4d0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2a4e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2a4f0 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
2a500 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
2a510 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
2a520 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
2a530 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
2a540 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
2a550 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
2a560 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
2a570 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
2a580 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2a590 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
2a5a0 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
2a5b0 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
2a5c0 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
2a5d0 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
2a5e0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
2a5f0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2a600 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
2a610 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
2a620 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2a630 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
2a640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a650 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
2a660 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
2a670 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
2a680 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
2a690 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
2a6a0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2a6b0 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
2a6c0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
2a6d0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
2a6e0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
2a6f0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
2a700 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
2a710 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
2a720 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
2a730 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
2a740 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
2a750 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
2a760 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
2a770 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2a780 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
2a790 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
2a7a0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
2a7b0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
2a7c0 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
2a7d0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2a7e0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2a7f0 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
2a800 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2a810 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
2a820 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
2a830 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
2a840 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
2a850 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
2a860 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
2a870 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
2a880 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
2a890 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
2a8a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2a8b0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2a8c0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
2a8d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
2a8e0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
2a8f0 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
2a900 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
2a910 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
2a920 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
2a930 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
2a940 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2a950 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
2a960 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
2a970 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
2a980 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2a990 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2a9a0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
2a9b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a9c0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2a9d0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2a9e0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2a9f0 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
2aa00 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
2aa10 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b  Offset + 2*idx];
2aa20 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
2aa30 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
2aa40 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2aa50 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
2aa60 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
2aa70 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
2aa80 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
2aa90 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2aaa0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
2aab0 20 3c 20 67 65 74 32 62 79 74 65 28 26 64 61 74   < get2byte(&dat
2aac0 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b  a[hdr+5]) || pc+
2aad0 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
2aae0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
2aaf0 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
2ab00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ab10 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2ab20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
2ab30 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
2ab40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2ab50 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
2ab60 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
2ab70 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61 67  (i=idx+1; i<pPag
2ab80 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70  e->nCell; i++, p
2ab90 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b  tr+=2){.    ptr[
2aba0 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20  0] = ptr[2];.   
2abb0 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d   ptr[1] = ptr[3]
2abc0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
2abd0 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
2abe0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
2abf0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
2ac00 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
2ac10 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 2;.}../*.** In
2ac20 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
2ac30 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
2ac40 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
2ac50 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
2ac60 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
2ac70 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
2ac80 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
2ac90 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
2aca0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
2acb0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
2acc0 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
2acd0 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
2ace0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
2acf0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
2ad00 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
2ad10 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
2ad20 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
2ad30 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
2ad40 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
2ad50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64  age->aOvfl[] and
2ad60 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
2ad70 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
2ad80 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
2ad90 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
2ada0 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
2adb0 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
2adc0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
2add0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
2ade0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
2adf0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
2ae00 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
2ae10 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
2ae20 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mented..**.** If
2ae30 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
2ae40 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ro, then do not 
2ae50 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e  copy the first n
2ae60 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
2ae70 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63  e.** cell. The c
2ae80 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77  aller will overw
2ae90 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20  rite them after 
2aea0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2aeb0 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b  turns. If.** nSk
2aec0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2aed0 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e  then pCell may n
2aee0 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69  ot point to an i
2aef0 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f  nvalid memory lo
2af00 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20  cation .** (but 
2af10 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61  pCell+nSkip is a
2af20 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f  lways valid)..*/
2af30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
2af40 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
2af50 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
2af60 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
2af70 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
2af80 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
2af90 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
2afa0 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
2afb0 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
2afc0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
2afd0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
2afe0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
2aff0 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
2b000 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
2b010 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
2b020 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
2b030 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
2b040 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
2b050 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
2b060 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
2b070 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
2b080 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
2b090 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
2b0a0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
2b0b0 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
2b0c0 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
2b0d0 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
2b0e0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
2b0f0 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
2b100 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
2b110 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
2b120 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
2b130 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
2b140 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
2b150 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2b160 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65  unter */.  int e
2b170 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
2b180 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
2b190 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
2b1a0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
2b1b0 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
2b1c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2b1d0 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
2b1e0 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
2b1f0 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
2b200 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
2b210 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
2b220 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
2b230 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
2b240 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2b250 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
2b260 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
2b270 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
2b280 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
2b290 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
2b2a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
2b2b0 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
2b2c0 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20  ..  int nSkip = 
2b2d0 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29  (iChild ? 4 : 0)
2b2e0 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  ;..  if( *pRC ) 
2b2f0 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
2b300 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50  t( i>=0 && i<=pP
2b310 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65  age->nCell+pPage
2b320 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
2b330 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b340 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70  nCell<=MX_CELL(p
2b350 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58  Page->pBt) && MX
2b360 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2b370 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73  )<=5460 );.  ass
2b380 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2b390 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
2b3a0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29  (pPage->aOvfl) )
2b3b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2b3c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2b3d0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2b3e0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
2b3f0 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
2b400 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
2b410 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
2b420 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
2b430 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
2b440 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
2b450 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
2b460 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
2b470 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
2b480 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
2b490 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
2b4a0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
2b4b0 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
2b4c0 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
2b4d0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
2b4e0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
2b4f0 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
2b500 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
2b510 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
2b520 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
2b530 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2b540 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
2b550 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2b560 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2b570 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
2b580 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
2b590 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
2b5a0 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
2b5b0 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
2b5c0 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
2b5d0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
2b5e0 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e  p+nSkip, pCell+n
2b5f0 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
2b600 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
2b610 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
2b620 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2b630 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
2b640 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  ll, iChild);.   
2b650 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
2b660 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
2b670 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
2b680 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
2b690 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
2b6a0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Page->aOvfl[0]))
2b6b0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
2b6c0 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
2b6d0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
2b6e0 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
2b6f0 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65   (u16)i;.  }else
2b700 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
2b710 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b720 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b730 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2b740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b750 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2b760 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
2b770 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2b780 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2b790 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2b7a0 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
2b7b0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2b7c0 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
2b7d0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
2b7e0 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
2b7f0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
2b800 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
2b810 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
2b820 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
2b830 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
2b840 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
2b850 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
2b860 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
2b870 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
2b880 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
2b890 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
2b8a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
2b8b0 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  wo properties.  
2b8c0 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
2b8d0 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  ns success */.  
2b8e0 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
2b8f0 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73   end+2 );.    as
2b900 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
2b910 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2b920 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50  leSize );.    pP
2b930 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
2b940 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
2b950 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b  = (u16)(2 + sz);
2b960 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
2b970 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43  a[idx+nSkip], pC
2b980 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
2b990 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43  kip);.    if( iC
2b9a0 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
2b9b0 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
2b9c0 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
2b9d0 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2c  }.    for(j=end,
2b9e0 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
2b9f0 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
2ba00 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
2ba10 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
2ba20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
2ba30 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
2ba40 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
2ba50 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
2ba60 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
2ba70 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
2ba80 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
2ba90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2baa0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2bab0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
2bac0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2bad0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
2bae0 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
2baf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
2bb00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
2bb10 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
2bb20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
2bb30 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
2bb40 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
2bb50 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
2bb60 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
2bb70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
2bb80 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
2bb90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
2bba0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
2bbb0 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
2bbc0 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
2bbd0 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
2bbe0 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
2bbf0 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
2bc00 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
2bc10 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
2bc20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
2bc30 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
2bc40 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
2bc50 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
2bc60 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
2bc70 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
2bc80 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
2bc90 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
2bca0 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
2bcb0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
2bcc0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
2bcd0 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
2bce0 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20  /.  u16 *aSize  
2bcf0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
2bd00 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
2bd10 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2bd20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2bd30 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  unter */.  u8 *p
2bd40 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20  Cellptr;     /* 
2bd50 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
2bd60 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
2bd70 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20    int cellbody; 
2bd80 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2bd90 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79  f next cell body
2bda0 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
2bdb0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
2bdc0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2bdd0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2bde0 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a  data for pPage *
2bdf0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  /.  const int hd
2be00 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2be10 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
2be20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
2be30 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a  der on pPage */.
2be40 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61    const int nUsa
2be50 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ble = pPage->pBt
2be60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a  ->usableSize; /*
2be70 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
2be80 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  page */..  asser
2be90 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2bea0 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
2beb0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2bec0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2bed0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2bee0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20  ssert( nCell>=0 
2bef0 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  && nCell<=MX_CEL
2bf00 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
2bf10 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
2bf20 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20  pBt)<=5460 );.  
2bf30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2bf40 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2bf50 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2bf60 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
2bf70 68 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73  hat the page has
2bf80 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65   just been zeroe
2bf90 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20  d by zeroPage() 
2bfa0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
2bfb0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2bfc0 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
2bfd0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2bfe0 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20  ==nUsable );..  
2bff0 70 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74 61  pCellptr = &data
2c000 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
2c010 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  et + nCell*2];. 
2c020 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61   cellbody = nUsa
2c030 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65  ble;.  for(i=nCe
2c040 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ll-1; i>=0; i--)
2c050 7b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d  {.    pCellptr -
2c060 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64  = 2;.    cellbod
2c070 79 20 2d 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  y -= aSize[i];. 
2c080 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
2c090 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  lptr, cellbody);
2c0a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
2c0b0 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43  a[cellbody], apC
2c0c0 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d  ell[i], aSize[i]
2c0d0 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
2c0e0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
2c0f0 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
2c100 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
2c110 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
2c120 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e  age->nFree -= (n
2c130 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65  Cell*2 + nUsable
2c140 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20   - cellbody);.  
2c150 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28  pPage->nCell = (
2c160 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a  u16)nCell;.}../*
2c170 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2c180 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74  g parameters det
2c190 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
2c1a0 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67  adjacent pages g
2c1b0 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69  et involved.** i
2c1c0 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  n a balancing op
2c1d0 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20  eration.  NN is 
2c1e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  the number of ne
2c1f0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2c200 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65  r side.** of the
2c210 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69   page that parti
2c220 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
2c230 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
2c240 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a  n.  NB is the.**
2c250 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
2c260 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74   pages that part
2c270 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69  icipate, includi
2c280 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61  ng the target pa
2c290 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69  ge and.** NN nei
2c2a0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2c2b0 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   side..**.** The
2c2c0 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f   minimum value o
2c2d0 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f  f NN is 1 (of co
2c2e0 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69  urse).  Increasi
2c2f0 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a  ng NN above 1.**
2c300 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76   (to 2 or 3) giv
2c310 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72  es a modest impr
2c320 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43  ovement in SELEC
2c330 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72  T and DELETE per
2c340 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65  formance.** in e
2c350 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61  xchange for a la
2c360 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e  rger degradation
2c370 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55   in INSERT and U
2c380 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  PDATE performanc
2c390 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  e..** The value 
2c3a0 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f  of NN appears to
2c3b0 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72   give the best r
2c3c0 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a  esults overall..
2c3d0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20  */.#define NN 1 
2c3e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c3f0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
2c400 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
2c410 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64  e of pPage */.#d
2c420 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31  efine NB (NN*2+1
2c430 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  )      /* Total 
2c440 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  pages involved i
2c450 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f  n the balance */
2c460 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
2c470 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
2c480 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
2c490 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
2c4a0 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
2c4b0 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
2c4c0 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
2c4d0 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
2c4e0 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
2c4f0 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
2c500 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
2c510 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
2c520 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
2c530 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
2c540 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
2c550 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
2c560 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
2c570 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20  ad of trying to 
2c580 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
2c590 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
2c5a0 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
2c5b0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
2c5c0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
2c5d0 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
2c5e0 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
2c5f0 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
2c600 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
2c610 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
2c620 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
2c630 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
2c640 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
2c650 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
2c660 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
2c670 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
2c680 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
2c690 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
2c6a0 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
2c6b0 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
2c6c0 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
2c6d0 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
2c6e0 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
2c6f0 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
2c700 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
2c710 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
2c720 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
2c730 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
2c740 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
2c750 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
2c760 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
2c770 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
2c780 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
2c790 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
2c7a0 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73  fer is used to s
2c7b0 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79  tore a temporary
2c7c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76   copy of the div
2c7d0 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61  ider.** cell tha
2c7e0 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  t will be insert
2c7f0 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ed into pParent.
2c800 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e   Such a cell con
2c810 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20  sists of a 4.** 
2c820 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
2c830 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76   followed by a v
2c840 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2c850 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72  nteger. In other
2c860 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f  .** words, at mo
2c870 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e  st 13 bytes. Hen
2c880 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  ce the pSpace bu
2c890 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a  ffer must be at.
2c8a0 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65  ** least 13 byte
2c8b0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
2c8c0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2c8d0 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a  _quick(MemPage *
2c8e0 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65  pParent, MemPage
2c8f0 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70   *pPage, u8 *pSp
2c900 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ace){.  BtShared
2c910 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50   *const pBt = pP
2c920 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  age->pBt;    /* 
2c930 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20  B-Tree Database 
2c940 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  */.  MemPage *pN
2c950 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2c960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2c970 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ly allocated pag
2c980 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
2c990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c9b0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
2c9c0 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20  Pgno pgnoNew;   
2c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2c9f0 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a  ber of pNew */..
2ca00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ca10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2ca20 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2ca30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2ca40 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ca50 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
2ca60 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2ca70 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2ca80 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 69 66  flow==1 );..  if
2ca90 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
2caa0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2cab0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2cac0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
2cad0 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20   new page. This 
2cae0 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
2caf0 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69   the right-sibli
2cb00 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67  ng of .  ** pPag
2cb10 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65  e. Make the pare
2cb20 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65  nt page writable
2cb30 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  , so that the ne
2cb40 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  w divider cell. 
2cb50 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72   ** may be inser
2cb60 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65  ted. If both the
2cb70 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  se operations ar
2cb80 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72  e successful, pr
2cb90 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63  oceed..  */.  rc
2cba0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2cbb0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
2cbc0 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
2cbd0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2cbe0 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75  ITE_OK ){..    u
2cbf0 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63  8 *pOut = &pSpac
2cc00 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  e[4];.    u8 *pC
2cc10 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
2cc20 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20  fl[0].pCell;.   
2cc30 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65   u16 szCell = ce
2cc40 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2cc50 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20   pCell);.    u8 
2cc60 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73  *pStop;..    ass
2cc70 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2cc80 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65  rIswriteable(pNe
2cc90 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  w->pDbPage) );. 
2cca0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ccb0 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46  ->aData[0]==(PTF
2ccc0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
2ccd0 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29  DATA|PTF_LEAF) )
2cce0 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
2ccf0 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  New, PTF_INTKEY|
2cd00 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
2cd10 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65  _LEAF);.    asse
2cd20 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31  mblePage(pNew, 1
2cd30 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c  , &pCell, &szCel
2cd40 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  l);..    /* If t
2cd50 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2cd60 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2cd70 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2cd80 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69  er map.    ** wi
2cd90 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
2cda0 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
2cdb0 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
2cdc0 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65  m the .    ** ce
2cdd0 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ll on the page t
2cde0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2cdf0 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66  ge. If either of
2ce00 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70   these.    ** op
2ce10 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20  erations fails, 
2ce20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
2ce30 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65 20  is set, but the 
2ce40 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20  contents.    ** 
2ce50 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
2ce60 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e  ge are still man
2ce70 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68 20  ipulated by thh 
2ce80 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20  code below..    
2ce90 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61  ** That is Ok, a
2cea0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
2ceb0 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
2cec0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20  guaranteed to.  
2ced0 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
2cee0 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69  s dirty. Returni
2cef0 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
2cf00 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20   will cause a.  
2cf10 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75    ** rollback, u
2cf20 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67  ndoing any chang
2cf30 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70  es made to the p
2cf40 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
2cf50 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2cf60 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2cf70 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2cf80 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f  pgnoNew, PTRMAP_
2cf90 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
2cfa0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
2cfb0 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65    if( szCell>pNe
2cfc0 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20  w->minLocal ){. 
2cfd0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
2cfe0 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43  OvflPtr(pNew, pC
2cff0 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ell, &rc);.     
2d000 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
2d010 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69  /* Create a divi
2d020 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65  der cell to inse
2d030 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  rt into pParent.
2d040 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   The divider cel
2d050 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74  l.    ** consist
2d060 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61  s of a 4-byte pa
2d070 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70  ge number (the p
2d080 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50  age number of pP
2d090 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20  age) and.    ** 
2d0a0 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2d0b0 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69  h key value (whi
2d0c0 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  ch must be the s
2d0d0 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ame value as the
2d0e0 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  .    ** largest 
2d0f0 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20  key on pPage).. 
2d100 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20     **.    ** To 
2d110 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74  find the largest
2d120 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50   key value on pP
2d130 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20  age, first find 
2d140 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a  the right-most .
2d150 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
2d160 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20  Page. The first 
2d170 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  two fields of th
2d180 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20  is cell are the 
2d190 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c  .    ** record-l
2d1a0 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c  ength (a variabl
2d1b0 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
2d1c0 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73   at most 32-bits
2d1d0 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a   in size).    **
2d1e0 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c   and the key val
2d1f0 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  ue (a variable l
2d200 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d  ength integer, m
2d210 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75  ay have any valu
2d220 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  e)..    ** The f
2d230 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c  irst of the whil
2d240 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c  e(...) loops bel
2d250 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68  ow skips over th
2d260 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a  e record-length.
2d270 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68      ** field. Th
2d280 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e  e second while(.
2d290 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20  ..) loop copies 
2d2a0 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72  the key value fr
2d2b0 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65  om the.    ** ce
2d2c0 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f  ll on pPage into
2d2d0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
2d2e0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  er..    */.    p
2d2f0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2d300 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
2d310 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f  ell-1);.    pSto
2d320 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
2d330 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65     while( (*(pCe
2d340 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70  ll++)&0x80) && p
2d350 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20  Cell<pStop );.  
2d360 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
2d370 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
2d380 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28  ((*(pOut++) = *(
2d390 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20  pCell++))&0x80) 
2d3a0 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
2d3b0 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  ;..    /* Insert
2d3c0 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
2d3d0 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65   cell into pPare
2d3e0 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72  nt. */.    inser
2d3f0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
2d400 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70  Parent->nCell, p
2d410 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75  Space, (int)(pOu
2d420 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20  t-pSpace),.     
2d430 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50 61            0, pPa
2d440 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ge->pgno, &rc);.
2d450 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
2d460 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
2d470 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ter of pParent t
2d480 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
2d490 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
2d4a0 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
2d4b0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2d4c0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2d4d0 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20  pgnoNew);.  .   
2d4e0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
2d4f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2d500 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
2d510 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2d520 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
2d530 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
2d540 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  /* SQLITE_OMIT_Q
2d550 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a  UICKBALANCE */..
2d560 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73  #if 0./*.** This
2d570 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2d580 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e  ot contribute an
2d590 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70  ything to the op
2d5a0 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74  eration of SQLit
2d5b0 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  e..** it is some
2d5c0 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20  times activated 
2d5d0 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c  temporarily whil
2d5e0 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65  e debugging code
2d5f0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a   responsible .**
2d600 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69   for setting poi
2d610 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2d620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d630 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
2d640 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67  (MemPage **apPag
2d650 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20  e, int nPage){. 
2d660 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
2d670 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69  (i=0; i<nPage; i
2d680 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b  ++){.    Pgno n;
2d690 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d  .    u8 e;.    M
2d6a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2d6b0 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42  apPage[i];.    B
2d6c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2d6d0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61  Page->pBt;.    a
2d6e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2d6f0 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72  Init );..    for
2d700 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e  (j=0; j<pPage->n
2d710 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Cell; j++){.    
2d720 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2d730 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20  .      u8 *z;.  
2d740 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69     .      z = fi
2d750 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29  ndCell(pPage, j)
2d760 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
2d770 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2d780 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20   z, &info);.    
2d790 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
2d7a0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
2d7b0 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
2d7c0 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76  byte(&z[info.iOv
2d7d0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
2d7e0 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2d7f0 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a   ovfl, &e, &n);.
2d800 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d810 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2d820 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  & e==PTRMAP_OVER
2d830 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d  FLOW1 );.      }
2d840 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
2d850 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2d860 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
2d870 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20  get4byte(z);.   
2d880 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2d890 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
2d8a0 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
2d8b0 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2d8c0 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2d8d0 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d  BTREE );.      }
2d8e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
2d8f0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2d900 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
2d910 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2d920 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2d930 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2d940 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2d950 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
2d960 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
2d970 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2d980 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
2d990 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  REE );.    }.  }
2d9a0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
2d9b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
2d9c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2d9d0 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63  ed to copy the c
2d9e0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
2d9f0 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65  -tree node store
2da00 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46  d .** on page pF
2da10 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
2da20 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77   If page pFrom w
2da30 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61  as not a leaf pa
2da40 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ge, then.** the 
2da50 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2da60 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69  ies for each chi
2da70 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61  ld page are upda
2da80 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a  ted so that the.
2da90 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  ** parent page s
2daa0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69  tored in the poi
2dab0 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65  nter map is page
2dac0 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63   pTo. If pFrom c
2dad0 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20  ontained.** any 
2dae0 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66  cells with overf
2daf0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
2db00 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72  s, then the corr
2db10 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65  esponding pointe
2db20 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
2db30 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65   are also update
2db40 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  d so that the pa
2db50 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67  rent page is pag
2db60 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e pTo..**.** If 
2db70 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74  pFrom is current
2db80 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20  ly carrying any 
2db90 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28  overflow cells (
2dba0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a  entries in the.*
2dbb0 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b  * MemPage.aOvfl[
2dbc0 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61  ] array), they a
2dbd0 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f  re not copied to
2dbe0 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66   pTo. .**.** Bef
2dbf0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70  ore returning, p
2dc00 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69  age pTo is reini
2dc10 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62  tialized using b
2dc20 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
2dc30 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72  **.** The perfor
2dc40 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75  mance of this fu
2dc50 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72  nction is not cr
2dc60 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e  itical. It is on
2dc70 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74  ly used by .** t
2dc80 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c  he balance_shall
2dc90 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e  ower() and balan
2dca0 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63  ce_deeper() proc
2dcb0 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20  edures, neither 
2dcc0 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20  of.** which are 
2dcd0 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64  called often und
2dce0 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d  er normal circum
2dcf0 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  stances..*/.stat
2dd00 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65  ic void copyNode
2dd10 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20  Content(MemPage 
2dd20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20  *pFrom, MemPage 
2dd30 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b  *pTo, int *pRC){
2dd40 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
2dd50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dd60 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74  BtShared * const
2dd70 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42   pBt = pFrom->pB
2dd80 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  t;.    u8 * cons
2dd90 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d  t aFrom = pFrom-
2dda0 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a  >aData;.    u8 *
2ddb0 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f   const aTo = pTo
2ddc0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74  ->aData;.    int
2ddd0 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20   const iFromHdr 
2dde0 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73  = pFrom->hdrOffs
2ddf0 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  et;.    int cons
2de00 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f  t iToHdr = ((pTo
2de10 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30  ->pgno==1) ? 100
2de20 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72   : 0);.    int r
2de30 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61  c;.    int iData
2de40 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65  ;.  .  .    asse
2de50 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69  rt( pFrom->isIni
2de60 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
2de70 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69   pFrom->nFree>=i
2de80 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73  ToHdr );.    ass
2de90 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61  ert( get2byte(&a
2dea0 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d  From[iFromHdr+5]
2deb0 29 3c 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )<=pBt->usableSi
2dec0 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
2ded0 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
2dee0 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
2def0 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
2df00 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
2df10 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
2df20 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
2df30 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
2df40 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
2df50 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
2df60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
2df70 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
2df80 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
2df90 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
2dfa0 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
2dfb0 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
2dfc0 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
2dfd0 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
2dfe0 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
2dff0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2e000 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
2e010 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
2e020 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
2e030 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
2e040 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
2e050 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
2e060 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
2e070 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
2e080 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
2e090 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
2e0a0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
2e0b0 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
2e0c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
2e0d0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2e0e0 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
2e0f0 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
2e100 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e110 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
2e120 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2e130 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
2e140 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2e150 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2e160 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
2e170 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2e180 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
2e190 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
2e1a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
2e1b0 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
2e1c0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
2e1d0 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
2e1e0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2e1f0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
2e200 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
2e210 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
2e220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2e230 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
2e240 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
2e250 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
2e260 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
2e270 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
2e280 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
2e290 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
2e2a0 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
2e2b0 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
2e2c0 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
2e2d0 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
2e2e0 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
2e2f0 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
2e300 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
2e310 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
2e320 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
2e330 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
2e340 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
2e350 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
2e360 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
2e370 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
2e380 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
2e390 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
2e3a0 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
2e3b0 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
2e3c0 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
2e3d0 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
2e3e0 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
2e3f0 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
2e400 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
2e410 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
2e420 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
2e430 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
2e440 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
2e450 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
2e460 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
2e470 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
2e480 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
2e490 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
2e4a0 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
2e4b0 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
2e4c0 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
2e4d0 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
2e4e0 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
2e4f0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
2e500 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2e510 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
2e520 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
2e530 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
2e540 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
2e550 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
2e560 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
2e570 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
2e580 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
2e590 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
2e5a0 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
2e5b0 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
2e5c0 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
2e5d0 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
2e5e0 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
2e5f0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
2e600 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2e610 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
2e620 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
2e630 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
2e640 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
2e650 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
2e660 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
2e670 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
2e680 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
2e690 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
2e6a0 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
2e6b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
2e6c0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
2e6d0 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
2e6e0 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
2e6f0 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
2e700 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
2e710 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
2e720 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
2e730 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
2e740 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
2e750 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
2e760 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
2e770 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
2e780 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
2e790 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
2e7a0 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
2e7b0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
2e7c0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
2e7d0 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
2e7e0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
2e7f0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
2e800 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
2e810 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
2e820 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2e830 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
2e840 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
2e850 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
2e860 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20  a.** buffer big 
2e870 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f  enough to hold o
2e880 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c  ne page. If whil
2e890 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  e inserting cell
2e8a0 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
2e8b0 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
2e8c0 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  nt) the parent p
2e8d0 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
2e8e0 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
2e8f0 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
2e900 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
2e910 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  's overflow cell
2e920 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
2e930 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
2e940 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
2e950 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
2e960 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
2e970 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
2e980 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
2e990 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
2e9a0 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
2e9b0 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
2e9c0 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
2e9d0 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
2e9e0 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
2e9f0 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
2ea00 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2ea10 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
2ea20 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
2ea30 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
2ea40 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
2ea50 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
2ea60 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
2ea70 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2ea80 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2ea90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2eaa0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2eab0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2eac0 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
2ead0 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
2eae0 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65  e of siblings be
2eaf0 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
2eb00 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78    int iParentIdx
2eb10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2eb20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74    /* Index of "t
2eb30 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72  he page" in pPar
2eb40 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76  ent */.  u8 *aOv
2eb50 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  flSpace,        
2eb60 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65           /* page
2eb70 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  -size bytes of s
2eb80 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20  pace for parent 
2eb90 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ovfl */.  int is
2eba0 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
2ebb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ebc0 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20  e if pParent is 
2ebd0 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29  a root-page */.)
2ebe0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2ebf0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2ec00 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
2ec10 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
2ec20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
2ec30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ec40 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
2ec50 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
2ec60 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
2ec70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2ec80 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
2ec90 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
2eca0 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
2ecb0 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
2ecc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ecd0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
2ece0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
2ecf0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
2ed00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ed10 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
2ed20 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Old[] */.  int i
2ed30 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
2ed40 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ed50 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2ed60 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
2ed70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2ed80 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
2ed90 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
2eda0 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  l[] */.  int rc 
2edb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2edc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
2edd0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  urn code */.  u1
2ede0 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6 leafCorrection
2edf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
2ee00 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
2ee10 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
2ee20 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
2ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee40 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
2ee50 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
2ee60 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
2ee70 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
2ee80 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
2ee90 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
2eea0 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
2eeb0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
2eec0 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
2eed0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2eee0 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
2eef0 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
2ef00 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
2ef10 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
2ef20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
2ef30 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
2ef40 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
2ef50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2ef60 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
2ef70 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
2ef80 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c  ] */.  int iOvfl
2ef90 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
2efa0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
2efb0 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66  sed byte of aOvf
2efc0 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e  lSpace[] */.  in
2efd0 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
2efe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2eff0 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
2f000 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
2f010 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
2f020 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
2f030 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
2f040 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
2f050 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2f060 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
2f070 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
2f080 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
2f090 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
2f0a0 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
2f0b0 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
2f0c0 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
2f0d0 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
2f0e0 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ancing */.  u8 *
2f0f0 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
2f100 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2f110 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f  tion in parent o
2f120 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  f right-sibling 
2f130 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
2f140 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20  *apDiv[NB-1];   
2f150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
2f160 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
2f170 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
2f180 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
2f190 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2f1a0 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
2f1b0 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
2f1c0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
2f1d0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2f1e0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
2f1f0 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
2f200 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
2f210 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2f220 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
2f230 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
2f240 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
2f250 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
2f260 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2f270 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
2f280 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
2f290 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
2f2a0 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
2f2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2f2c0 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20  pace for copies 
2f2d0 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
2f2e0 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
2f2f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f300 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20      /* Temp var 
2f310 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20  to store a page 
2f320 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20  number in */..  
2f330 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  pBt = pParent->p
2f340 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
2f350 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2f360 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2f370 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f380 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f390 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2f3a0 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20  ge) );..#if 0.  
2f3b0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2f3c0 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
2f3d0 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
2f3e0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
2f3f0 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e  ent->pgno));.#en
2f400 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  dif..  /* At thi
2f410 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20  s point pParent 
2f420 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74  may have at most
2f430 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   one overflow ce
2f440 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20  ll. And if.  ** 
2f450 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  this overflow ce
2f460 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  ll is present, i
2f470 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65  t must be the ce
2f480 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e  ll with .  ** in
2f490 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20  dex iParentIdx. 
2f4a0 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f  This scenario co
2f4b0 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74  mes about when t
2f4c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
2f4d0 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64  * is called (ind
2f4e0 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71  irectly) from sq
2f4f0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2f500 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
2f510 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
2f520 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
2f530 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2f540 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2f550 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2f560 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
2f570 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69  >aOvfl[0].idx==i
2f580 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20  ParentIdx );..  
2f590 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20  if( !aOvflSpace 
2f5a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2f5b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2f5c0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73  .  /* Find the s
2f5d0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
2f5e0 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f  balance. Also lo
2f5f0 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69  cate the cells i
2f600 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20  n pParent .  ** 
2f610 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20  that divide the 
2f620 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74  siblings. An att
2f630 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
2f640 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
2f650 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72   on .  ** either
2f660 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
2f670 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
2f680 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
2f690 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
2f6a0 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61  .  ** if there a
2f6b0 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
2f6c0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
2f6d0 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20   other side. If 
2f6e0 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
2f6f0 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
2f700 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
2f710 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
2f720 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a  nt are taken.  .
2f730 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
2f740 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74  oop also drops t
2f750 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2f760 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
2f770 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a   page. This.  **
2f780 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e   way, the remain
2f790 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74  der of the funct
2f7a0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ion does not hav
2f7b0 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61  e to deal with a
2f7c0 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  ny.  ** overflow
2f7d0 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61   cells in the pa
2f7e0 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65  rent page, since
2f7f0 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64 20   if any existed 
2f800 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68  they will.  ** h
2f810 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
2f820 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20   removed..  */. 
2f830 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f   i = pParent->nO
2f840 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e  verflow + pParen
2f850 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20  t->nCell;.  if( 
2f860 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  i<2 ){.    nxDiv
2f870 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d   = 0;.    nOld =
2f880 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   i+1;.  }else{. 
2f890 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20     nOld = 3;.   
2f8a0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2f8b0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
2f8c0 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44        .      nxD
2f8d0 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  iv = 0;.    }els
2f8e0 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78  e if( iParentIdx
2f8f0 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44  ==i ){.      nxD
2f900 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65  iv = i-2;.    }e
2f910 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  lse{.      nxDiv
2f920 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b   = iParentIdx-1;
2f930 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32  .    }.    i = 2
2f940 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e  ;.  }.  if( (i+n
2f950 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
2f960 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e  verflow)==pParen
2f970 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
2f980 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e  pRight = &pParen
2f990 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2f9a0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a  ->hdrOffset+8];.
2f9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69    }else{.    pRi
2f9c0 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ght = findCell(p
2f9d0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
2f9e0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2f9f0 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20  ow);.  }.  pgno 
2fa00 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68  = get4byte(pRigh
2fa10 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  t);.  while( 1 )
2fa20 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
2fa30 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
2fa40 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  gno, &apOld[i]);
2fa50 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2fa60 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
2fa70 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
2fa80 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
2fa90 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2faa0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
2fab0 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
2fac0 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
2fad0 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
2fae0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
2faf0 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (i--)==0 ) brea
2fb00 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78  k;..    if( i+nx
2fb10 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f  Div==pParent->aO
2fb20 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70 50  vfl[0].idx && pP
2fb30 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2fb40 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
2fb50 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f  i] = pParent->aO
2fb60 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
2fb70 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2fb80 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
2fb90 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
2fba0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
2fbb0 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
2fbc0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e        pParent->n
2fbd0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
2fbe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2fbf0 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
2fc00 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
2fc10 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2fc20 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70  erflow);.      p
2fc30 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
2fc40 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2fc50 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
2fc60 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2fc70 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20  apDiv[i]);..    
2fc80 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65    /* Drop the ce
2fc90 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ll from the pare
2fca0 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69  nt page. apDiv[i
2fcb0 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74  ] still points t
2fcc0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  o.      ** the c
2fcd0 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70  ell within the p
2fce0 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75  arent, even thou
2fcf0 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  gh it has been d
2fd00 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  ropped..      **
2fd10 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65   This is safe be
2fd20 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61  cause dropping a
2fd30 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77   cell only overw
2fd40 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a  rites the first.
2fd50 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
2fd60 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74  tes of it, and t
2fd70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2fd80 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66  s not need the f
2fd90 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
2fda0 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ur bytes of the 
2fdb0 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f  divider cell. So
2fdc0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
2fdd0 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20  safe to use.    
2fde0 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20    ** later on.  
2fdf0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2fe00 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65  ** Unless SQLite
2fe10 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
2fe20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
2fe30 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
2fe40 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  ,.      ** the d
2fe50 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e  ropCell() routin
2fe60 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  e will overwrite
2fe70 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
2fe80 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20   with zeroes..  
2fe90 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2fea0 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79  ase, temporarily
2feb0 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69   copy the cell i
2fec0 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61  nto the aOvflSpa
2fed0 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75  ce[].      ** bu
2fee0 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65  ffer. It will be
2fef0 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69   copied out agai
2ff00 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  n as soon as the
2ff10 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72   aSpace[] buffer
2ff20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c  .      ** is all
2ff30 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  ocated.  */.    
2ff40 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72    if( pBt->secur
2ff50 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  eDelete ){.     
2ff60 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 53 51     int iOff = SQ
2ff70 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
2ff80 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49  apDiv[i]) - SQLI
2ff90 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50  TE_PTR_TO_INT(pP
2ffa0 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20  arent->aData);. 
2ffb0 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66         if( (iOff
2ffc0 2b 73 7a 4e 65 77 5b 69 5d 29 3e 70 42 74 2d 3e  +szNew[i])>pBt->
2ffd0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
2ffe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2fff0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30000 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  ;.          mems
30010 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b  et(apOld, 0, (i+
30020 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  1)*sizeof(MemPag
30030 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e*));.          
30040 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
30050 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 65  anup;.        }e
30060 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
30070 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63  emcpy(&aOvflSpac
30080 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69  e[iOff], apDiv[i
30090 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20  ], szNew[i]);.  
300a0 20 20 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d          apDiv[i]
300b0 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61   = &aOvflSpace[a
300c0 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d  pDiv[i]-pParent-
300d0 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20 20  >aData];.       
300e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
300f0 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
30100 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
30110 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73  nt->nOverflow, s
30120 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  zNew[i], &rc);. 
30130 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
30140 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20  ake nMaxCells a 
30150 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e  multiple of 4 in
30160 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72   order to preser
30170 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61  ve 8-byte.  ** a
30180 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d  lignment */.  nM
30190 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43  axCells = (nMaxC
301a0 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20  ells + 3)&~3;.. 
301b0 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
301c0 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
301d0 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20  ry structures.  
301e0 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61  */.  k = pBt->pa
301f0 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28  geSize + ROUND8(
30200 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
30210 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a  ;.  szScratch =.
30220 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73         nMaxCells
30230 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20  *sizeof(u8*)    
30240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30250 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a     /* apCell */.
30260 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73       + nMaxCells
30270 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20  *sizeof(u16)    
30280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30290 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a     /* szCell */.
302a0 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65       + pBt->page
302b0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
302c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302d0 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f     /* aSpace1 */
302e0 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20  .     + k*nOld; 
302f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30310 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69      /* Page copi
30320 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20  es (apCopy) */. 
30330 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65   apCell = sqlite
30340 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20  3ScratchMalloc( 
30350 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20  szScratch ); .  
30360 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b  if( apCell==0 ){
30370 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
30380 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
30390 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
303a0 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d  ;.  }.  szCell =
303b0 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e   (u16*)&apCell[n
303c0 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70  MaxCells];.  aSp
303d0 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43  ace1 = (u8*)&szC
303e0 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
303f0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
30400 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61  BYTE_ALIGNMENT(a
30410 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a  Space1) );..  /*
30420 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74  .  ** Load point
30430 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73  ers to all cells
30440 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65   on sibling page
30450 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  s and the divide
30460 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
30470 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65  o the local apCe
30480 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b  ll[] array.  Mak
30490 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  e copies of the 
304a0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
304b0 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  ** into space ob
304c0 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61  tained from aSpa
304d0 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65  ce1[] and remove
304e0 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72   the the divider
304f0 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   Cells.  ** from
30500 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
30510 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
30520 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
30530 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
30540 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
30550 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
30560 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
30570 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
30580 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
30590 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
305a0 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e   into aSpace1[].
305b0 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
305c0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
305d0 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
305e0 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
305f0 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
30600 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
30610 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
30620 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
30630 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
30640 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
30650 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
30660 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
30670 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
30680 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
30690 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
306a0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
306b0 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
306c0 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
306d0 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
306e0 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
306f0 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
30700 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
30710 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61  keys..  */.  lea
30720 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70  fCorrection = ap
30730 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a  Old[0]->leaf*4;.
30740 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f    leafData = apO
30750 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a  ld[0]->hasData;.
30760 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
30770 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  d; i++){.    int
30780 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20   limit;.    .   
30790 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
307a0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
307b0 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  take a copy of t
307c0 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c  he i'th original
307d0 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20   sibling.    ** 
307e0 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  The rest of this
307f0 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75   function will u
30800 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  se data from the
30810 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20   copies rather. 
30820 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f     ** that the o
30830 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69  riginal pages si
30840 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nce the original
30850 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69   pages will be i
30860 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f  n the.    ** pro
30870 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
30880 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
30890 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
308a0 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
308b0 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65  MemPage*)&aSpace
308c0 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  1[pBt->pageSize 
308d0 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63  + k*i];.    memc
308e0 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69  py(pOld, apOld[i
308f0 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ], sizeof(MemPag
30900 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61  e));.    pOld->a
30910 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70  Data = (void*)&p
30920 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  Old[1];.    memc
30930 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20  py(pOld->aData, 
30940 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
30950 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
30960 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f  ..    limit = pO
30970 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
30980 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66  nOverflow;.    f
30990 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
309a0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
309b0 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
309c0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70  ells );.      ap
309d0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
309e0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
309f0 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73  Old, j);.      s
30a00 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
30a10 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
30a20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
30a30 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
30a40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c      }.    if( i<
30a50 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44  nOld-1 && !leafD
30a60 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20  ata){.      u16 
30a70 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b  sz = (u16)szNew[
30a80 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54  i];.      u8 *pT
30a90 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72  emp;.      asser
30aa0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
30ab0 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  ls );.      szCe
30ac0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a  ll[nCell] = sz;.
30ad0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
30ae0 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b  Space1[iSpace1];
30af0 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20 2b  .      iSpace1 +
30b00 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
30b10 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
30b20 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
30b30 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31   assert( iSpace1
30b40 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
30b50 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
30b60 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c  pTemp, apDiv[i],
30b70 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65   sz);.      apCe
30b80 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d  ll[nCell] = pTem
30b90 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  p+leafCorrection
30ba0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30bb0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
30bc0 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74  0 || leafCorrect
30bd0 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
30be0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
30bf0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20  szCell[nCell] - 
30c00 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
30c10 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d        if( !pOld-
30c20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
30c30 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
30c40 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
30c50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
30c60 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30  ld->hdrOffset==0
30c70 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
30c80 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72  he right pointer
30c90 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
30ca0 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20  ge pOld becomes 
30cb0 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20  the left.       
30cc0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74   ** pointer of t
30cd0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
30ce0 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
30cf0 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
30d00 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d   &pOld->aData[8]
30d10 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
30d20 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
30d30 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
30d40 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
30d50 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c  if( szCell[nCell
30d60 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ]<4 ){.         
30d70 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
30d80 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c   any cells small
30d90 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e  er than 4 bytes.
30da0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a   */.          sz
30db0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
30dc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30dd0 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b   }.      nCell++
30de0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
30df0 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
30e00 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
30e10 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
30e20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
30e30 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
30e40 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
30e50 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
30e60 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
30e70 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
30e80 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
30e90 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
30ea0 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
30eb0 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
30ec0 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
30ed0 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
30ee0 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
30ef0 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65  page i from page
30f00 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
30f10 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
30f20 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
30f30 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70    ** Values comp
30f40 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  uted by this blo
30f50 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck:.  **.  **   
30f60 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74          k: The t
30f70 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
30f80 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a  ibling pages.  *
30f90 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53  *    szNew[i]: S
30fa0 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68  paced used on th
30fb0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
30fc0 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e  age..  **   cntN
30fd0 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20  ew[i]: Index in 
30fe0 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43  apCell[] and szC
30ff0 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69  ell[] for the fi
31000 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a  rst cell to.  **
31010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
31020 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69  e right of the i
31030 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
31040 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61  ..  ** usableSpa
31050 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  ce: Number of by
31060 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61  tes of space ava
31070 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73  ilable on each s
31080 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20  ibling..  ** .  
31090 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65  */.  usableSpace
310a0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
310b0 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f  ze - 12 + leafCo
310c0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28  rrection;.  for(
310d0 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20  subtotal=k=i=0; 
310e0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
310f0 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61     assert( i<nMa
31100 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75  xCells );.    su
31110 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
31120 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  [i] + 2;.    if(
31130 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62   subtotal > usab
31140 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  leSpace ){.     
31150 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
31160 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d  otal - szCell[i]
31170 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b  ;.      cntNew[k
31180 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  ] = i;.      if(
31190 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d   leafData ){ i--
311a0 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74  ; }.      subtot
311b0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
311c0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e  +;.      if( k>N
311d0 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49  B+1 ){ rc = SQLI
311e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
311f0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
31200 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20  eanup; }.    }. 
31210 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
31220 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
31230 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
31240 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
31250 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
31260 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
31270 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
31280 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
31290 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
312a0 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
312b0 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
312c0 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
312d0 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
312e0 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
312f0 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
31300 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
31310 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
31320 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
31330 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
31340 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
31350 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
31360 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
31370 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
31380 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
31390 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
313a0 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
313b0 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
313c0 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
313d0 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
313e0 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
313f0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
31400 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
31410 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
31420 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
31430 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
31440 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
31450 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
31460 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
31470 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
31480 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
31490 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
314a0 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
314b0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
314c0 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
314d0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
314e0 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
314f0 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
31500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
31510 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
31520 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
31530 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
31540 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
31550 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
31560 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
31570 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
31580 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
31590 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
315a0 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
315b0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
315c0 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
315d0 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
315e0 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
315f0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
31600 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67  ight==0 || szRig
31610 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d  ht+szCell[d]+2<=
31620 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72  szLeft-(szCell[r
31630 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73 7a  ]+2) ){.      sz
31640 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
31650 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
31660 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
31670 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
31680 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
31690 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
316a0 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
316b0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
316c0 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
316d0 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
316e0 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
316f0 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
31700 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
31710 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
31720 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
31730 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69 73  )>0) or pPage is
31740 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
31750 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
31760 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
31770 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
31780 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
31790 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
317a0 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
317b0 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
317c0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
317d0 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20   cntNew[0]>0 || 
317e0 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d  (pParent->pgno==
317f0 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43  1 && pParent->nC
31800 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54 52  ell==0) );..  TR
31810 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
31820 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c  ld: %d %d %d  ",
31830 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70  .    apOld[0]->p
31840 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  gno, .    nOld>=
31850 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67  2 ? apOld[1]->pg
31860 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  no : 0,.    nOld
31870 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e  >=3 ? apOld[2]->
31880 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a  pgno : 0.  ));..
31890 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
318a0 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
318b0 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
318c0 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
318d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c  .  */.  if( apOl
318e0 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b  d[0]->pgno<=1 ){
318f0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
31900 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31910 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
31920 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
31930 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
31940 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
31950 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
31960 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
31970 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
31980 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
31990 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
319a0 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
319b0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
319c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
319d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
319e0 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
319f0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
31a00 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
31a10 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
31a20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31a30 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
31a40 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
31a50 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
31a60 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
31a70 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
31a80 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
31a90 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
31aa0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
31ab0 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77  pNew;.      nNew
31ac0 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65  ++;..      /* Se
31ad0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
31ae0 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  p entry for the 
31af0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
31b00 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49  . */.      if( I
31b10 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
31b20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
31b30 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  (pBt, pNew->pgno
31b40 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
31b50 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
31b60 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
31b70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31b80 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
31b90 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31ba0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31bb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
31bc0 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64   /* Free any old
31bd0 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
31be0 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e   not reused as n
31bf0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ew pages..  */. 
31c00 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29   while( i<nOld )
31c10 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61  {.    freePage(a
31c20 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  pOld[i], &rc);. 
31c30 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
31c40 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31c50 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
31c60 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20  e(apOld[i]);.   
31c70 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
31c80 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
31c90 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e  *.  ** Put the n
31ca0 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  ew pages in acce
31cb0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68  nding order.  Th
31cc0 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a  is helps to.  **
31cd0 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e   keep entries in
31ce0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
31cf0 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20  n order so that 
31d00 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74  a scan.  ** of t
31d10 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69  he table is a li
31d20 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
31d30 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61  h the file.  Tha
31d40 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68  t.  ** in turn h
31d50 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69  elps the operati
31d60 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c  ng system to del
31d70 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20  iver pages.  ** 
31d80 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f  from the disk mo
31d90 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a  re rapidly..  **
31da0 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20  .  ** An O(n^2) 
31db0 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61  insertion sort a
31dc0 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64  lgorithm is used
31dd0 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a  , but since.  **
31de0 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65   n is never more
31df0 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c   than NB (a smal
31e00 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61  l constant), tha
31e10 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f  t should.  ** no
31e20 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a  t be a problem..
31e30 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e    **.  ** When N
31e40 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f  B==3, this one o
31e50 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65  ptimization make
31e60 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  s the database. 
31e70 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61   ** about 25% fa
31e80 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69  ster for large i
31e90 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65  nsertions and de
31ea0 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  letions..  */.  
31eb0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20  for(i=0; i<k-1; 
31ec0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  i++){.    int mi
31ed0 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70  nV = apNew[i]->p
31ee0 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  gno;.    int min
31ef0 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
31f00 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
31f10 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77  .      if( apNew
31f20 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67  [j]->pgno<(unsig
31f30 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
31f40 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
31f50 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e        minV = apN
31f60 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20  ew[j]->pgno;.   
31f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
31f80 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20  f( minI>i ){.   
31f90 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20     int t;.      
31fa0 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
31fb0 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d     t = apNew[i]-
31fc0 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20  >pgno;.      pT 
31fd0 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
31fe0 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e    apNew[i] = apN
31ff0 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20  ew[minI];.      
32000 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
32010 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
32020 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64  ACE(("new: %d(%d
32030 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
32040 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
32050 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e  ,.    apNew[0]->
32060 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  pgno, szNew[0],.
32070 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70      nNew>=2 ? ap
32080 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[1]->pgno : 0
32090 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
320a0 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
320b0 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d  ew>=3 ? apNew[2]
320c0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
320d0 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a  >=3 ? szNew[2] :
320e0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20   0,.    nNew>=4 
320f0 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f  ? apNew[3]->pgno
32100 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20   : 0, nNew>=4 ? 
32110 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20  szNew[3] : 0,.  
32120 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65    nNew>=5 ? apNe
32130 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[4]->pgno : 0, 
32140 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
32150 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73  4] : 0));..  ass
32160 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
32170 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
32180 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
32190 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69  ;.  put4byte(pRi
321a0 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  ght, apNew[nNew-
321b0 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  1]->pgno);..  /*
321c0 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
321d0 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
321e0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
321f0 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
32200 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
32210 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
32220 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
32230 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
32240 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
32250 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
32260 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
32270 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
32280 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
32290 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
322a0 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
322b0 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
322c0 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
322d0 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a  ew, pageFlags);.
322e0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
322f0 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d  (pNew, cntNew[i]
32300 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20  -j, &apCell[j], 
32310 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20  &szCell[j]);.   
32320 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
32330 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d  Cell>0 || (nNew=
32340 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d  =1 && cntNew[0]=
32350 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  =0) );.    asser
32360 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c  t( pNew->nOverfl
32370 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20  ow==0 );..    j 
32380 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
32390 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
323a0 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
323b0 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
323c0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
323d0 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
323e0 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
323f0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
32400 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
32410 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
32420 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43  <nNew-1 || j==nC
32430 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ell );.    if( j
32440 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  <nCell ){.      
32450 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
32460 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20   u8 *pTemp;.    
32470 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20    int sz;..     
32480 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
32490 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43  ells );.      pC
324a0 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b  ell = apCell[j];
324b0 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65  .      sz = szCe
324c0 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72  ll[j] + leafCorr
324d0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54  ection;.      pT
324e0 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  emp = &aOvflSpac
324f0 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20  e[iOvflSpace];. 
32500 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e       if( !pNew->
32510 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
32520 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44  memcpy(&pNew->aD
32530 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34  ata[8], pCell, 4
32540 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
32550 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20  f( leafData ){. 
32560 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
32570 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d   tree is a leaf-
32580 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74  data tree, and t
32590 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
325a0 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20  leaves, .       
325b0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69   ** then there i
325c0 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c  s no divider cel
325d0 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49  l in apCell[]. I
325e0 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69  nstead, the divi
325f0 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  der .        ** 
32600 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
32610 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79   the integer key
32620 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d   for the right-m
32630 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20  ost cell of .   
32640 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c       ** the sibl
32650 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c  ing-page assembl
32660 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20  ed above only.. 
32670 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32680 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
32690 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20  .        j--;.  
326a0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
326b0 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  CellPtr(pNew, ap
326c0 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b  Cell[j], &info);
326d0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
326e0 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   pTemp;.        
326f0 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69  sz = 4 + putVari
32700 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e  nt(&pCell[4], in
32710 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  fo.nKey);.      
32720 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
32730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32740 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
32750 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65        /* Obscure
32760 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65   case for non-le
32770 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49  af-data trees: I
32780 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43  f the cell at pC
32790 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  ell was.        
327a0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74  ** previously st
327b0 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e  ored on a leaf n
327c0 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70  ode, and its rep
327d0 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34  orted size was 4
327e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
327f0 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61  s, then it may a
32800 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c  ctually be small
32810 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20  er than this .  
32820 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74        ** (see bt
32830 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
32840 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68  ), 4 bytes is th
32850 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
32860 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  f.        ** any
32870 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69   cell). But it i
32880 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
32890 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
328a0 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
328b0 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
328c0 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
328d0 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
328e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
328f0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
32900 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
32910 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
32920 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
32930 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
32940 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
32950 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
32960 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
32970 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
32980 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
32990 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
329a0 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
329b0 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
329c0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
329d0 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
329e0 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
329f0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
32a00 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
32a10 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
32a20 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
32a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32a40 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20       iOvflSpace 
32a50 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
32a60 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
32a70 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
32a80 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53    assert( iOvflS
32a90 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
32aa0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73  ize );.      ins
32ab0 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
32ac0 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73   nxDiv, pCell, s
32ad0 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e  z, pTemp, pNew->
32ae0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
32af0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32b00 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
32b10 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
32b20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
32b30 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
32b40 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
32b50 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b  ge) );..      j+
32b60 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
32b70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
32b80 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29  sert( j==nCell )
32b90 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64  ;.  assert( nOld
32ba0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
32bb0 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20  nNew>0 );.  if( 
32bc0 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46  (pageFlags & PTF
32bd0 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEAF)==0 ){.   
32be0 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61   u8 *zChild = &a
32bf0 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61  pCopy[nOld-1]->a
32c00 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d  Data[8];.    mem
32c10 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d  cpy(&apNew[nNew-
32c20 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43  1]->aData[8], zC
32c30 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20  hild, 4);.  }.. 
32c40 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70   if( isRoot && p
32c50 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
32c60 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72   && pParent->hdr
32c70 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d  Offset<=apNew[0]
32c80 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f  ->nFree ){.    /
32c90 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
32ca0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
32cb0 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  w contains no ce
32cc0 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69  lls. The only si
32cd0 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67  bling.    ** pag
32ce0 65 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  e is the right-c
32cf0 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  hild of the pare
32d00 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e  nt. Copy the con
32d10 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
32d20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69   ** child page i
32d30 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20  nto the parent, 
32d40 64 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f  decreasing the o
32d50 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66  verall height of
32d60 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72   the.    ** b-tr
32d70 65 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20  ee structure by 
32d80 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73  one. This is des
32d90 63 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62  cribed as the "b
32da0 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72  alance-shallower
32db0 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67  ".    ** sub-alg
32dc0 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64  orithm in some d
32dd0 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20  ocumentation..  
32de0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
32df0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
32e00 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
32e10 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79  the call to copy
32e20 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20  NodeContent() . 
32e30 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70     ** sets all p
32e40 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
32e50 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
32e60 20 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61   to database ima
32e70 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
32e80 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70   for which the p
32e90 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64  ointer is stored
32ea0 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74   within the cont
32eb0 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64  ent being copied
32ec0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32ed0 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72  The second asser
32ee0 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  t below verifies
32ef0 20 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20   that the child 
32f00 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65  page is defragme
32f10 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20  nted.    ** (it 
32f20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77  must be, as it w
32f30 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72  as just reconstr
32f40 75 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65  ucted using asse
32f50 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69  mblePage()). Thi
32f60 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f  s.    ** is impo
32f70 72 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72  rtant if the par
32f80 65 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73  ent page happens
32f90 20 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66   to be page 1 of
32fa0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
32fb0 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a    ** image.  */.
32fc0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77      assert( nNew
32fd0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
32fe0 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t( apNew[0]->nFr
32ff0 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28  ee == .        (
33000 67 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b  get2byte(&apNew[
33010 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70  0]->aData[5])-ap
33020 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73  New[0]->cellOffs
33030 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65  et-apNew[0]->nCe
33040 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20  ll*2) .    );.  
33050 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e    copyNodeConten
33060 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72  t(apNew[0], pPar
33070 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66  ent, &rc);.    f
33080 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d  reePage(apNew[0]
33090 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20  , &rc);.  }else 
330a0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
330b0 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74   ){.    /* Fix t
330c0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
330d0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
330e0 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65  he cells that we
330f0 72 65 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e  re shifted aroun
33100 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65  d. .    ** There
33110 20 61 72 65 20 73 65 76 65 72 61 6c 20 64 69 66   are several dif
33120 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20  ferent types of 
33130 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
33140 69 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ies that need to
33150 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
33160 20 77 69 74 68 20 62 79 20 74 68 69 73 20 72 6f   with by this ro
33170 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74  utine. Some of t
33180 68 65 73 65 20 68 61 76 65 20 62 65 65 6e 20 73  hese have been s
33190 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a  et already, but.
331a0 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65      ** many have
331b0 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77   not. The follow
331c0 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79  ing is a summary
331d0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
331e0 20 20 31 29 20 54 68 65 20 65 6e 74 72 69 65 73    1) The entries
331f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
33200 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
33210 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
33220 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62  .    **      sib
33230 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20  lings when this 
33240 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
33250 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76 65 20  led. These have 
33260 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20  already.    **  
33270 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65      been set. We
33280 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77   don't need to w
33290 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73  orry about old s
332a0 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72  iblings that wer
332b0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f  e.    **      mo
332c0 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
332d0 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50  list - the freeP
332e0 61 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74  age() code has t
332f0 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a  aken care.    **
33300 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a        of those..
33310 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
33320 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d  2) The pointer-m
33330 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  ap entries assoc
33340 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
33350 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20  irst overflow.  
33360 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69    **      page i
33370 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63  n any overflow c
33380 68 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65  hains used by ne
33390 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e  w divider cells.
333a0 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20   These .    **  
333b0 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c      have also al
333c0 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e  ready been taken
333d0 20 63 61 72 65 20 6f 66 20 62 79 20 74 68 65 20   care of by the 
333e0 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64  insertCell() cod
333f0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
33400 20 20 20 33 29 20 49 66 20 74 68 65 20 73 69 62     3) If the sib
33410 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
33420 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
33430 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  the child pages 
33440 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63  of.    **      c
33450 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74  ells stored on t
33460 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
33470 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
33480 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  updated..    **.
33490 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74      **   4) If t
334a0 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
334b0 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61   are not interna
334c0 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20  l intkey nodes, 
334d0 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  then any.    ** 
334e0 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
334f0 67 65 73 20 75 73 65 64 20 62 79 20 74 68 65 73  ges used by thes
33500 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64  e cells may need
33510 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20   to be updated. 
33520 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65     **      (inte
33530 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65  rnal intkey node
33540 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20  s never contain 
33550 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72  pointers to over
33560 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20  flow pages)..   
33570 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20   **.    **   5) 
33580 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
33590 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ages are not lea
335a0 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f  ves, then the po
335b0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
335c0 20 20 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f        entries fo
335d0 72 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  r the right-chil
335e0 64 20 70 61 67 65 73 20 6f 66 20 65 61 63 68 20  d pages of each 
335f0 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64  sibling may need
33600 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20  .    **      to 
33610 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
33620 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20  **.    ** Cases 
33630 31 20 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c  1 and 2 are deal
33640 74 20 77 69 74 68 20 61 62 6f 76 65 20 62 79 20  t with above by 
33650 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20  other code. The 
33660 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
33670 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63 61 73  k deals with cas
33680 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74  es 3 and 4 and t
33690 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61  he one after tha
336a0 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65  t, case 5. Since
336b0 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20  .    ** setting 
336c0 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  a pointer map en
336d0 74 72 79 20 69 73 20 61 20 72 65 6c 61 74 69 76  try is a relativ
336e0 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70  ely expensive op
336f0 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20  eration, this.  
33700 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73    ** code only s
33710 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ets pointer map 
33720 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c  entries for chil
33730 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  d or overflow pa
33740 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20  ges that have.  
33750 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f    ** actually mo
33760 76 65 64 20 62 65 74 77 65 65 6e 20 70 61 67 65  ved between page
33770 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  s.  */.    MemPa
33780 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
33790 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  [0];.    MemPage
337a0 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
337b0 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65  0];.    int nOve
337c0 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f  rflow = pOld->nO
337d0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74  verflow;.    int
337e0 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64   iNextOld = pOld
337f0 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66  ->nCell + nOverf
33800 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76  low;.    int iOv
33810 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66  erflow = (nOverf
33820 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66  low ? pOld->aOvf
33830 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a  l[0].idx : -1);.
33840 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20      j = 0;      
33850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33860 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
33870 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20  t 'old' sibling 
33880 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20  page */.    k = 
33890 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
338a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
338b0 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20  * Current 'new' 
338c0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a  sibling page */.
338d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
338e0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
338f0 20 20 69 6e 74 20 69 73 44 69 76 69 64 65 72 20    int isDivider 
33900 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 0;.      while
33910 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b  ( i==iNextOld ){
33920 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
33930 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
33940 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
33950 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
33960 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20  ll on old.      
33970 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
33980 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e j. If the sibl
33990 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
339a0 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
339b0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
339c0 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
339d0 6c 20 69 20 77 61 73 20 61 20 64 69 76 69 64 65  l i was a divide
339e0 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  r cell. */.     
339f0 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79     pOld = apCopy
33a00 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  [++j];.        i
33a10 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c  NextOld = i + !l
33a20 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e  eafData + pOld->
33a30 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f  nCell + pOld->nO
33a40 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20  verflow;.       
33a50 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72   if( pOld->nOver
33a60 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
33a70 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f    nOverflow = pO
33a80 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
33a90 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c           iOverfl
33aa0 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ow = i + !leafDa
33ab0 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c  ta + pOld->aOvfl
33ac0 5b 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 20  [0].idx;.       
33ad0 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76   }.        isDiv
33ae0 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61  ider = !leafData
33af0 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;  .      }..   
33b00 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66     assert(nOverf
33b10 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c  low>0 || iOverfl
33b20 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73  ow<i );.      as
33b30 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32  sert(nOverflow<2
33b40 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b   || pOld->aOvfl[
33b50 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f  0].idx==pOld->aO
33b60 76 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20  vfl[1].idx-1);. 
33b70 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
33b80 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d  rflow<3 || pOld-
33b90 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70  >aOvfl[1].idx==p
33ba0 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64  Old->aOvfl[2].id
33bb0 78 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x-1);.      if( 
33bc0 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  i==iOverflow ){.
33bd0 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65          isDivide
33be0 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69  r = 1;.        i
33bf0 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29  f( (--nOverflow)
33c00 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
33c10 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  iOverflow++;.   
33c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
33c30 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74        if( i==cnt
33c40 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20  New[k] ){.      
33c50 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74    /* Cell i is t
33c60 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  he cell immediat
33c70 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
33c80 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e  e last cell on n
33c90 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  ew.        ** si
33ca0 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66  bling page k. If
33cb0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
33cc0 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73  e not leaf pages
33cd0 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   of an.        *
33ce0 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c  * intkey b-tree,
33cf0 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20   then cell i is 
33d00 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  a divider cell. 
33d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77   */.        pNew
33d20 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20   = apNew[++k];. 
33d30 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66         if( !leaf
33d40 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Data ) continue;
33d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
33d60 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b  ssert( j<nOld );
33d70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b  .      assert( k
33d80 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20  <nNew );..      
33d90 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77  /* If the cell w
33da0 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69  as originally di
33db0 76 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20  vider cell (and 
33dc0 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20  is not now) or. 
33dd0 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66       ** an overf
33de0 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20  low cell, or if 
33df0 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63  the cell was loc
33e00 61 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72  ated on a differ
33e10 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20  ent sibling.    
33e20 20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65    ** page before
33e30 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20   the balancing, 
33e40 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
33e50 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73   map entries ass
33e60 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  ociated.      **
33e70 20 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20   with any child 
33e80 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
33e90 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  s need to be upd
33ea0 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ated.  */.      
33eb0 69 66 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c  if( isDivider ||
33ec0 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65   pOld->pgno!=pNe
33ed0 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20  w->pgno ){.     
33ee0 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72     if( !leafCorr
33ef0 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ection ){.      
33f00 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
33f10 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65  t, get4byte(apCe
33f20 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42  ll[i]), PTRMAP_B
33f30 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  TREE, pNew->pgno
33f40 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
33f50 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  }.        if( sz
33f60 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69  Cell[i]>pNew->mi
33f70 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
33f80 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
33f90 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
33fa0 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  l[i], &rc);.    
33fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
33fc0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65    }..    if( !le
33fd0 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
33fe0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
33ff0 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
34000 20 20 20 20 20 75 33 32 20 6b 65 79 20 3d 20 67       u32 key = g
34010 65 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b 69  et4byte(&apNew[i
34020 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  ]->aData[8]);.  
34030 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
34040 70 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50  pBt, key, PTRMAP
34050 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d  _BTREE, apNew[i]
34060 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
34070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
34080 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74   0.    /* The pt
34090 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 29  rmapCheckPages()
340a0 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74   contains assert
340b0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  () statements th
340c0 61 74 20 76 65 72 69 66 79 20 74 68 61 74 0a 20  at verify that. 
340d0 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65     ** all pointe
340e0 72 20 6d 61 70 20 70 61 67 65 73 20 61 72 65 20  r map pages are 
340f0 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54  set correctly. T
34100 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77  his is helpful w
34110 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62  hile .    ** deb
34120 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20  ugging. This is 
34130 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64  usually disabled
34140 20 62 65 63 61 75 73 65 20 61 20 63 6f 72 72 75   because a corru
34150 70 74 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a  pt database may.
34160 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20      ** cause an 
34170 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
34180 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a  nt to fail.  */.
34190 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50      ptrmapCheckP
341a0 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77  ages(apNew, nNew
341b0 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65  );.    ptrmapChe
341c0 63 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e 74  ckPages(&pParent
341d0 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 1);.#endif.  }
341e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
341f0 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ent->isInit );. 
34200 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
34210 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d  : finished: old=
34220 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d  %d new=%d cells=
34230 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
34240 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
34250 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ll));..  /*.  **
34260 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20   Cleanup before 
34270 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  returning..  */.
34280 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a  balance_cleanup:
34290 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  .  sqlite3Scratc
342a0 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  hFree(apCell);. 
342b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
342c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
342d0 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
342e0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
342f0 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
34300 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34310 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a  apNew[i]);.  }..
34320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34330 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
34340 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
34350 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67  hen the root pag
34360 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74  e of a b-tree st
34370 72 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76  ructure is.** ov
34380 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20  erfull (has one 
34390 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
343a0 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41   pages)..**.** A
343b0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
343c0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
343d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
343e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f   the current roo
343f0 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75  t.** page, inclu
34400 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63 65  ding overflow ce
34410 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64 20  lls, are copied 
34420 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20  into the child. 
34430 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  The root.** page
34440 20 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72 69   is then overwri
34450 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20  tten to make it 
34460 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  an empty page wi
34470 74 68 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  th the right-chi
34480 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70  ld .** pointer p
34490 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e  ointing to the n
344a0 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42  ew page..**.** B
344b0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
344c0 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70   all pointer-map
344d0 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70   entries corresp
344e0 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 73 20  onding to pages 
344f0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77  .** that the new
34500 20 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20   child-page now 
34510 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
34520 73 20 74 6f 20 61 72 65 20 75 70 64 61 74 65 64  s to are updated
34530 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63  . The.** entry c
34540 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
34550 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68  the new right-ch
34560 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ild pointer of t
34570 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
34580 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2e  is also updated.
34590 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
345a0 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69  sful, *ppChild i
345b0 73 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e  s set to contain
345c0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
345d0 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61  the child .** pa
345e0 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
345f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
34600 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 63   this case the c
34610 61 6c 6c 65 72 20 69 73 20 72 65 71 75 69 72 65  aller is require
34620 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c  d.** to call rel
34630 65 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a 70  easePage() on *p
34640 70 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20 6f  pChild exactly o
34650 6e 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  nce. If an error
34660 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65   occurs,.** an e
34670 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
34680 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68 69  urned and *ppChi
34690 6c 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ld is set to 0..
346a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
346b0 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d  lance_deeper(Mem
346c0 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d  Page *pRoot, Mem
346d0 50 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b  Page **ppChild){
346e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
346f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34700 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
34710 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64  e from subproced
34720 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ures */.  MemPag
34730 65 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20 20  e *pChild = 0;  
34740 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
34750 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69  ter to a new chi
34760 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  ld page */.  Pgn
34770 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b  o pgnoChild = 0;
34780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
34790 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
347a0 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
347b0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
347c0 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74  pBt = pRoot->pBt
347d0 3b 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65  ;    /* The BTre
347e0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
347f0 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pRoot->nOverflow
34800 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
34810 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
34820 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
34830 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f  ;..  /* Make pRo
34840 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ot, the root pag
34850 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 2c  e of the b-tree,
34860 20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63   writable. Alloc
34870 61 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ate a new .  ** 
34880 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62  page that will b
34890 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 72 69  ecome the new ri
348a0 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61  ght-child of pPa
348b0 67 65 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e  ge. Copy the con
348c0 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  tents.  ** of th
348d0 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e  e node stored on
348e0 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20   pRoot into the 
348f0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  new child page..
34900 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
34910 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52  te3PagerWrite(pR
34920 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  oot->pDbPage);. 
34930 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34940 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  OK ){.    rc = a
34950 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
34960 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67  (pBt,&pChild,&pg
34970 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70  noChild,pRoot->p
34980 67 6e 6f 2c 30 29 3b 0a 20 20 20 20 63 6f 70 79  gno,0);.    copy
34990 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f  NodeContent(pRoo
349a0 74 2c 20 70 43 68 69 6c 64 2c 20 26 72 63 29 3b  t, pChild, &rc);
349b0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
349c0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
349d0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
349e0 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f  noChild, PTRMAP_
349f0 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67  BTREE, pRoot->pg
34a00 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
34a10 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a    }.  if( rc ){.
34a20 20 20 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30      *ppChild = 0
34a30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
34a40 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72  e(pChild);.    r
34a50 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
34a60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
34a70 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34a80 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29  pChild->pDbPage)
34a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
34aa0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34ab0 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
34ac0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
34ad0 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
34ae0 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29  ==pRoot->nCell )
34af0 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  ;..  TRACE(("BAL
34b00 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20  ANCE: copy root 
34b10 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70  %d into %d\n", p
34b20 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69  Root->pgno, pChi
34b30 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f  ld->pgno));..  /
34b40 2a 20 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66  * Copy the overf
34b50 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70  low cells from p
34b60 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a  Root to pChild *
34b70 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c  /.  memcpy(pChil
34b80 64 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d  d->aOvfl, pRoot-
34b90 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e  >aOvfl, pRoot->n
34ba0 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28  Overflow*sizeof(
34bb0 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pRoot->aOvfl[0])
34bc0 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  );.  pChild->nOv
34bd0 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e  erflow = pRoot->
34be0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a  nOverflow;..  /*
34bf0 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e   Zero the conten
34c00 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65  ts of pRoot. The
34c10 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64  n install pChild
34c20 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   as the right-ch
34c30 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61  ild. */.  zeroPa
34c40 67 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64  ge(pRoot, pChild
34c50 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54  ->aData[0] & ~PT
34c60 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62  F_LEAF);.  put4b
34c70 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
34c80 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
34c90 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64  et+8], pgnoChild
34ca0 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d  );..  *ppChild =
34cb0 20 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72   pChild;.  retur
34cc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
34cd0 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74  /*.** The page t
34ce0 68 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74  hat pCur current
34cf0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ly points to has
34d00 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66   just been modif
34d10 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77  ied in.** some w
34d20 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ay. This functio
34d30 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66  n figures out if
34d40 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69   this modificati
34d50 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  on means the.** 
34d60 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65  tree needs to be
34d70 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69   balanced, and i
34d80 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61  f so calls the a
34d90 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e  ppropriate balan
34da0 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  cing .** routine
34db0 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  . Balancing rout
34dc0 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ines are:.**.** 
34dd0 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28    balance_quick(
34de0 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64  ).**   balance_d
34df0 65 65 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c  eeper().**   bal
34e00 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a  ance_nonroot().*
34e10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
34e20 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70  ance(BtCursor *p
34e30 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Cur){.  int rc =
34e40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f   SQLITE_OK;.  co
34e50 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70  nst int nMin = p
34e60 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  Cur->pBt->usable
34e70 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20  Size * 2 / 3;.  
34e80 75 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b  u8 aBalanceQuick
34e90 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20  Space[13];.  u8 
34ea0 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54  *pFree = 0;..  T
34eb0 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c  ESTONLY( int bal
34ec0 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65  ance_quick_calle
34ed0 64 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f  d = 0 );.  TESTO
34ee0 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65  NLY( int balance
34ef0 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d  _deeper_called =
34f00 20 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20   0 );..  do {.  
34f10 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
34f20 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d  ur->iPage;.    M
34f30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
34f40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
34f50 67 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50  ge];..    if( iP
34f60 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
34f70 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
34f80 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
34f90 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
34fa0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69   of the b-tree i
34fb0 73 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74  s overfull. In t
34fc0 68 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68  his case call th
34fd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c  e.        ** bal
34fe0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66 75  ance_deeper() fu
34ff0 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  nction to create
35000 20 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72   a new child for
35010 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
35020 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f         ** and co
35030 70 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  py the current c
35040 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
35050 6f 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20  oot-page to it. 
35060 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  The.        ** n
35070 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
35080 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c   the do-loop wil
35090 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68  l balance the ch
350a0 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20  ild page..      
350b0 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73    */ .        as
350c0 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64  sert( (balance_d
350d0 65 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d  eeper_called++)=
350e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
350f0 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65   = balance_deepe
35100 72 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e  r(pPage, &pCur->
35110 61 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20  apPage[1]);.    
35120 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35130 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
35140 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
35150 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   1;.          pC
35160 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
35170 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
35180 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a  ->aiIdx[1] = 0;.
35190 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
351a0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31  ( pCur->apPage[1
351b0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  ]->nOverflow );.
351c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
351d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
351e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
351f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
35200 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
35210 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
35220 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62  =nMin ){.      b
35230 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
35240 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
35250 20 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d   const pParent =
35260 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50   pCur->apPage[iP
35270 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e  age-1];.      in
35280 74 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70  t const iIdx = p
35290 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
352a0 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  -1];..      rc =
352b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
352c0 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  te(pParent->pDbP
352d0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
352e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
352f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35300 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
35310 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  E.        if( pP
35320 61 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20  age->hasData.   
35330 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e        && pPage->
35340 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20  nOverflow==1.   
35350 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e        && pPage->
35360 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50  aOvfl[0].idx==pP
35370 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20  age->nCell.     
35380 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e      && pParent->
35390 70 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20  pgno!=1.        
353a0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
353b0 6c 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20  ll==iIdx.       
353c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
353d0 20 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75   Call balance_qu
353e0 69 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20  ick() to create 
353f0 61 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66  a new sibling of
35400 20 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a   pPage on which.
35410 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
35420 73 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c  store the overfl
35430 6f 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65  ow cell. balance
35440 5f 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73  _quick() inserts
35450 20 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20   a new cell.    
35460 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50        ** into pP
35470 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79  arent, which may
35480 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f   cause pParent o
35490 76 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73  verflow. If this
354a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
354b0 70 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20  ppens, the next 
354c0 69 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  interation of th
354d0 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62  e do-loop will b
354e0 61 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a  alance pParent .
354f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
35500 20 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f   either balance_
35510 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c  nonroot() or bal
35520 61 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55  ance_deeper(). U
35530 6e 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20  ntil this.      
35540 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20      ** happens, 
35550 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
35560 6c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  l is stored in t
35570 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b  he aBalanceQuick
35580 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20  Space[].        
35590 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20    ** buffer. .  
355a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
355b0 20 20 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70       ** The purp
355c0 6f 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ose of the follo
355d0 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 69 73  wing assert() is
355e0 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f   to check that o
355f0 6e 6c 79 20 61 0a 20 20 20 20 20 20 20 20 20 20  nly a.          
35600 2a 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74  ** single call t
35610 6f 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  o balance_quick(
35620 29 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61  ) is made for ea
35630 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  ch call to this.
35640 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
35650 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77  ction. If this w
35660 65 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64  ere not verified
35670 2c 20 61 20 73 75 62 74 6c 65 20 62 75 67 20 69  , a subtle bug i
35680 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20  nvolving reuse. 
35690 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74           ** of t
356a0 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b  he aBalanceQuick
356b0 53 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e  Space[] might sn
356c0 65 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20  eak in..        
356d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
356e0 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f  ssert( (balance_
356f0 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d  quick_called++)=
35700 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
35710 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69  rc = balance_qui
35720 63 6b 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67  ck(pParent, pPag
35730 65 2c 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b  e, aBalanceQuick
35740 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
35750 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
35760 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
35770 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
35780 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e  , call balance_n
35790 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69  onroot() to redi
357a0 73 74 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20  stribute cells. 
357b0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77           ** betw
357c0 65 65 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70  een pPage and up
357d0 20 74 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62   to 2 of its sib
357e0 6c 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73  ling pages. This
357f0 20 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20   involves.      
35800 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67      ** modifying
35810 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
35820 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20   pParent, which 
35830 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e  may cause pParen
35840 74 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  t to.          *
35850 2a 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  * become overful
35860 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
35870 54 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  The next iterati
35880 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
35890 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77  p.          ** w
358a0 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ill balance the 
358b0 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63  parent page to c
358c0 6f 72 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20  orrect this..   
358d0 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
358e0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70       ** If the p
358f0 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d  arent page becom
35900 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65  es overfull, the
35910 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f   overflow cell o
35920 72 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20  r cells.        
35930 20 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20    ** are stored 
35940 69 6e 20 74 68 65 20 70 53 70 61 63 65 20 62 75  in the pSpace bu
35950 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69  ffer allocated i
35960 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77  mmediately below
35970 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  . .          ** 
35980 41 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65  A subsequent ite
35990 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
359a0 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20  -loop will deal 
359b0 77 69 74 68 20 74 68 69 73 20 62 79 0a 20 20 20  with this by.   
359c0 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e         ** callin
359d0 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  g balance_nonroo
359e0 74 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65  t() (balance_dee
359f0 70 65 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c  per() may be cal
35a00 6c 65 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20  led first,.     
35a10 20 20 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64       ** but it d
35a20 6f 65 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68  oesn't deal with
35a30 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
35a40 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65  - just moves the
35a50 6d 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20  m to a.         
35a60 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61   ** different pa
35a70 67 65 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73  ge). Once this s
35a80 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
35a90 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  o balance_nonroo
35aa0 74 28 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a  t() .          *
35ab0 2a 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c  * has completed,
35ac0 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72   it is safe to r
35ad0 65 6c 65 61 73 65 20 74 68 65 20 70 53 70 61 63  elease the pSpac
35ae0 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
35af0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
35b00 65 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c  e previous call,
35b10 20 61 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   as the overflow
35b20 20 63 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20   cell data will 
35b30 68 61 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20  have been .     
35b40 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65       ** copied e
35b50 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62  ither into the b
35b60 6f 64 79 20 6f 66 20 61 20 64 61 74 61 62 61 73  ody of a databas
35b70 65 20 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74  e page or into t
35b80 68 65 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20  he new.         
35b90 20 2a 2a 20 70 53 70 61 63 65 20 62 75 66 66 65   ** pSpace buffe
35ba0 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  r passed to the 
35bb0 6c 61 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62  latter call to b
35bc0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
35bd0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
35be0 20 20 20 20 20 20 20 20 20 75 38 20 2a 70 53 70           u8 *pSp
35bf0 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
35c00 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42  eMalloc(pCur->pB
35c10 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
35c20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
35c30 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61  ance_nonroot(pPa
35c40 72 65 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61  rent, iIdx, pSpa
35c50 63 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20  ce, iPage==1);. 
35c60 20 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72           if( pFr
35c70 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
35c80 20 20 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73    /* If pFree is
35c90 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f   not NULL, it po
35ca0 69 6e 74 73 20 74 6f 20 74 68 65 20 70 53 70 61  ints to the pSpa
35cb0 63 65 20 62 75 66 66 65 72 20 75 73 65 64 20 0a  ce buffer used .
35cc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
35cd0 79 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c  y a previous cal
35ce0 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  l to balance_non
35cf0 72 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e 74  root(). Its cont
35d00 65 6e 74 73 20 61 72 65 0a 20 20 20 20 20 20 20  ents are.       
35d10 20 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72       ** now stor
35d20 65 64 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61  ed either on rea
35d30 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  l database pages
35d40 20 6f 72 20 77 69 74 68 69 6e 20 74 68 65 20 0a   or within the .
35d50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
35d60 65 77 20 70 53 70 61 63 65 20 62 75 66 66 65 72  ew pSpace buffer
35d70 2c 20 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73  , so it may be s
35d80 61 66 65 6c 79 20 66 72 65 65 64 20 68 65 72 65  afely freed here
35d90 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
35da0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
35db0 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  (pFree);.       
35dc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
35dd0 2f 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  /* The pSpace bu
35de0 66 66 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65  ffer will be fre
35df0 65 64 20 61 66 74 65 72 20 74 68 65 20 6e 65 78  ed after the nex
35e00 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20  t call to.      
35e10 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e      ** balance_n
35e20 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73  onroot(), or jus
35e30 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  t before this fu
35e40 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
35e50 77 68 69 63 68 65 76 65 72 0a 20 20 20 20 20 20  whichever.      
35e60 20 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72      ** comes fir
35e70 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  st. */.         
35e80 20 70 46 72 65 65 20 3d 20 70 53 70 61 63 65 3b   pFree = pSpace;
35e90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35ea0 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 2d   }..      pPage-
35eb0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
35ec0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  .      /* The ne
35ed0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
35ee0 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61  the do-loop bala
35ef0 6e 63 65 73 20 74 68 65 20 70 61 72 65 6e 74 20  nces the parent 
35f00 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72  page. */.      r
35f10 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
35f20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  );.      pCur->i
35f30 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
35f40 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
35f50 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
35f60 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
35f70 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72  ite3PageFree(pFr
35f80 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
35f90 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
35fa0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
35fb0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
35fc0 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
35fd0 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
35fe0 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
35ff0 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
36000 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
36010 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
36020 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
36030 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
36040 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
36050 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
36060 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
36070 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
36080 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
36090 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
360a0 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
360b0 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
360c0 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
360d0 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
360e0 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
360f0 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
36100 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
36110 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
36120 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
36130 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65  **.** If the see
36140 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65  kResult paramete
36150 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
36160 68 65 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c  hen a successful
36170 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65   call to.** Move
36180 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
36190 73 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72  seek cursor pCur
361a0 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29   to (pKey, nKey)
361b0 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
361c0 62 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20  been performed. 
361d0 73 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68  seekResult is th
361e0 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 20  e search result 
361f0 72 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61  returned (a nega
36200 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69  tive.** number i
36210 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  f pCur points at
36220 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69   an entry that i
36230 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28  s smaller than (
36240 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a  pKey, nKey), or.
36250 2a 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  ** a positive va
36260 6c 75 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e  lue if pCur poin
36270 74 73 20 61 74 20 61 6e 20 65 74 72 79 20 74 68  ts at an etry th
36280 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
36290 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65  n .** (pKey, nKe
362a0 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  y)). .**.** If t
362b0 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61  he seekResult pa
362c0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
362d0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ero, then the ca
362e0 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
362f0 74 68 61 74 0a 2a 2a 20 63 75 72 73 6f 72 20 70  that.** cursor p
36300 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
36310 61 74 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  at the existing 
36320 63 6f 70 79 20 6f 66 20 61 20 72 6f 77 20 74 68  copy of a row th
36330 61 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a 20 6f  at is to be.** o
36340 76 65 72 77 72 69 74 74 65 6e 2e 20 20 49 66 20  verwritten.  If 
36350 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70  the seekResult p
36360 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74  arameter is 0, t
36370 68 65 6e 20 63 75 72 73 6f 72 20 70 43 75 72 20  hen cursor pCur 
36380 6d 61 79 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  may.** point to 
36390 61 6e 79 20 65 6e 74 72 79 20 6f 72 20 74 6f 20  any entry or to 
363a0 6e 6f 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 20  no entry at all 
363b0 61 6e 64 20 73 6f 20 74 68 69 73 20 66 75 6e 63  and so this func
363c0 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 65 6b  tion has to seek
363d0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 62  .** the cursor b
363e0 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20 6b 65  efore the new ke
363f0 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72 74 65  y can be inserte
36400 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
36410 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a 20 20  3BtreeInsert(.  
36420 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
36430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36440 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69 6e  * Insert data in
36450 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20  to the table of 
36460 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
36470 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
36480 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
36490 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20 74 68  /* The key of th
364a0 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a  e new record */.
364b0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
364c0 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
364d0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f 66 20   /* The data of 
364e0 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
364f0 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
36500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36510 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
36520 65 78 74 72 61 20 30 20 62 79 74 65 73 20 74 6f  extra 0 bytes to
36530 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74 61 20   append to data 
36540 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e 64 42  */.  int appendB
36550 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ias,            
36560 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
36570 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e  his is likely an
36580 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74   append */.  int
36590 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20 20 20   seekResult     
365a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
365b0 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72 20 4d  esult of prior M
365c0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
365d0 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  call */.){.  int
365e0 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d   rc;.  int loc =
365f0 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20 20 20   seekResult;    
36600 20 20 20 20 20 20 2f 2a 20 2d 31 3a 20 62 65 66        /* -1: bef
36610 6f 72 65 20 64 65 73 69 72 65 64 20 6c 6f 63 61  ore desired loca
36620 74 69 6f 6e 20 20 2b 31 3a 20 61 66 74 65 72 20  tion  +1: after 
36630 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 20 3d  */.  int szNew =
36640 20 30 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20   0;.  int idx;. 
36650 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
36660 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
36670 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
36680 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
36690 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
366a0 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a   char *oldCell;.
366b0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
366c0 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20  *newCell = 0;.. 
366d0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
366e0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
366f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
36700 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
36710 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
36720 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
36730 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 61 73  pNext;.  }..  as
36740 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
36750 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
36760 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
36770 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrFlag && pBt->i
36780 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
36790 41 4e 53 5f 57 52 49 54 45 20 26 26 20 21 70 42  ANS_WRITE && !pB
367a0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20  t->readOnly );. 
367b0 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
367c0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
367d0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
367e0 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ot, pCur->pKeyIn
367f0 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a 20 20  fo!=0, 2) );..  
36800 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
36810 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 62 65  he caller has be
36820 65 6e 20 63 6f 6e 73 69 73 74 65 6e 74 2e 20 49  en consistent. I
36830 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 61  f this cursor wa
36840 73 20 6f 70 65 6e 65 64 0a 20 20 2a 2a 20 65 78  s opened.  ** ex
36850 70 65 63 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  pecting an index
36860 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 74 68   b-tree, then th
36870 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
36880 62 65 20 69 6e 73 65 72 74 69 6e 67 20 62 6c 6f  be inserting blo
36890 62 0a 20 20 2a 2a 20 6b 65 79 73 20 77 69 74 68  b.  ** keys with
368a0 20 6e 6f 20 61 73 73 6f 63 69 61 74 65 64 20 64   no associated d
368b0 61 74 61 2e 20 49 66 20 74 68 65 20 63 75 72 73  ata. If the curs
368c0 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 65 78  or was opened ex
368d0 70 65 63 74 69 6e 67 20 61 6e 0a 20 20 2a 2a 20  pecting an.  ** 
368e0 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68  intkey table, th
368f0 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
36900 62 65 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 74  be inserting int
36910 65 67 65 72 20 6b 65 79 73 20 77 69 74 68 20 61  eger keys with a
36920 0a 20 20 2a 2a 20 62 6c 6f 62 20 6f 66 20 61 73  .  ** blob of as
36930 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20 20  sociated data.  
36940 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 4b  */.  assert( (pK
36950 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
36960 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
36970 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
36980 61 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61  an insert into a
36990 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 69   table b-tree, i
369a0 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
369b0 63 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72  crblob .  ** cur
369c0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  sors open on the
369d0 20 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c 61   row being repla
369e0 63 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ced (assuming th
369f0 69 73 20 69 73 20 61 20 72 65 70 6c 61 63 65 0a  is is a replace.
36a00 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d    ** operation -
36a10 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   if it is not, t
36a20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
36a30 61 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20  a no-op).  */.  
36a40 69 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  if( pCur->pKeyIn
36a50 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76  fo==0 ){.    inv
36a60 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
36a70 75 72 73 6f 72 73 28 70 2c 20 6e 4b 65 79 2c 20  ursors(p, nKey, 
36a80 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61  0);.  }..  /* Sa
36a90 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
36aa0 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
36ab0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
36ac0 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  is table..  **. 
36ad0 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73 65   ** In some case
36ae0 73 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62  s, the call to b
36af0 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c  treeMoveto() bel
36b00 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46  ow is a no-op. F
36b10 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c  or.  ** example,
36b20 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   when inserting 
36b30 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c  data into a tabl
36b40 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65  e with auto-gene
36b50 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20  rated integer.  
36b60 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42  ** keys, the VDB
36b70 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20  E layer invokes 
36b80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
36b90 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
36ba0 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67   the .  ** integ
36bb0 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49  er key to use. I
36bc0 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69  t then calls thi
36bd0 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63  s function to ac
36be0 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68  tually insert th
36bf0 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74  e .  ** data int
36c00 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54  o the intkey B-T
36c10 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
36c20 65 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20  e btreeMoveto() 
36c30 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20  recognizes.  ** 
36c40 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
36c50 69 73 20 61 6c 72 65 61 64 79 20 77 68 65 72 65  is already where
36c60 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
36c70 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74 68  and returns with
36c80 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61  out.  ** doing a
36c90 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69  ny work. To avoi
36ca0 64 20 74 68 77 61 72 74 69 6e 67 20 74 68 65 73  d thwarting thes
36cb0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c  e optimizations,
36cc0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
36cd0 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65  .  ** not to cle
36ce0 61 72 20 74 68 65 20 63 75 72 73 6f 72 20 68 65  ar the cursor he
36cf0 72 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  re..  */.  rc = 
36d00 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
36d10 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
36d20 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66 28  ot, pCur);.  if(
36d30 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
36d40 0a 20 20 69 66 28 20 21 6c 6f 63 20 29 7b 0a 20  .  if( !loc ){. 
36d50 20 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76     rc = btreeMov
36d60 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  eto(pCur, pKey, 
36d70 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73  nKey, appendBias
36d80 2c 20 26 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  , &loc);.    if(
36d90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
36da0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
36db0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
36dc0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 43  SOR_VALID || (pC
36dd0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
36de0 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c 6f  OR_INVALID && lo
36df0 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20 3d  c) );..  pPage =
36e00 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
36e10 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
36e20 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
36e30 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
36e40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36e50 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
36e60 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20  e->intKey );..  
36e70 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
36e80 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
36e90 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
36ea0 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
36eb0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
36ec0 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
36ed0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
36ee0 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
36ef0 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
36f00 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
36f10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
36f20 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f  isInit );.  allo
36f30 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
36f40 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20  t);.  newCell = 
36f50 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
36f60 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30    if( newCell==0
36f70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
36f80 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66  _NOMEM;.  rc = f
36f90 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c  illInCell(pPage,
36fa0 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20   newCell, pKey, 
36fb0 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61  nKey, pData, nDa
36fc0 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65  ta, nZero, &szNe
36fd0 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  w);.  if( rc ) g
36fe0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
36ff0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d    assert( szNew=
37000 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
37010 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a  ge, newCell) );.
37020 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c    assert( szNew<
37030 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42  =MX_CELL_SIZE(pB
37040 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43  t) );.  idx = pC
37050 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
37060 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f  iPage];.  if( lo
37070 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36 20  c==0 ){.    u16 
37080 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72  szOld;.    asser
37090 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  t( idx<pPage->nC
370a0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
370b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
370c0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
370d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
370e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
370f0 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20  insert;.    }.  
37100 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64    oldCell = find
37110 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
37120 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
37130 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
37140 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20  memcpy(newCell, 
37150 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  oldCell, 4);.   
37160 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63   }.    szOld = c
37170 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
37180 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
37190 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
371a0 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
371b0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
371c0 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 2c 20  ge, idx, szOld, 
371d0 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
371e0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
371f0 72 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rt;.  }else if( 
37200 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d 3e  loc<0 && pPage->
37210 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61  nCell>0 ){.    a
37220 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
37230 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  af );.    idx = 
37240 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
37250 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 65  ur->iPage];.  }e
37260 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
37270 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
37280 20 20 7d 0a 20 20 69 6e 73 65 72 74 43 65 6c 6c    }.  insertCell
37290 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77  (pPage, idx, new
372a0 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20  Cell, szNew, 0, 
372b0 30 2c 20 26 72 63 29 3b 0a 20 20 61 73 73 65 72  0, &rc);.  asser
372c0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
372d0 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   || pPage->nCell
372e0 3e 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76  >0 || pPage->nOv
372f0 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 2f  erflow>0 );..  /
37300 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 68 61  * If no error ha
37310 73 20 6f 63 63 75 72 65 64 20 61 6e 64 20 70 50  s occured and pP
37320 61 67 65 20 68 61 73 20 61 6e 20 6f 76 65 72 66  age has an overf
37330 6c 6f 77 20 63 65 6c 6c 2c 20 63 61 6c 6c 20 62  low cell, call b
37340 61 6c 61 6e 63 65 28 29 20 0a 20 20 2a 2a 20 74  alance() .  ** t
37350 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20 74  o redistribute t
37360 68 65 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20  he cells within 
37370 74 68 65 20 74 72 65 65 2e 20 53 69 6e 63 65 20  the tree. Since 
37380 62 61 6c 61 6e 63 65 28 29 20 6d 61 79 20 6d 6f  balance() may mo
37390 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73  ve.  ** the curs
373a0 6f 72 2c 20 7a 65 72 6f 20 74 68 65 20 42 74 43  or, zero the BtC
373b0 75 72 73 6f 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65  ursor.info.nSize
373c0 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 76 61   and BtCursor.va
373d0 6c 69 64 4e 4b 65 79 0a 20 20 2a 2a 20 76 61 72  lidNKey.  ** var
373e0 69 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  iables..  **.  *
373f0 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
37400 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61  ons of SQLite ca
37410 6c 6c 65 64 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  lled moveToRoot(
37420 29 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 75  ) to move the cu
37430 72 73 6f 72 0a 20 20 2a 2a 20 62 61 63 6b 20 74  rsor.  ** back t
37440 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
37450 61 73 20 62 61 6c 61 6e 63 65 28 29 20 75 73 65  as balance() use
37460 64 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  d to invalidate 
37470 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a  the contents.  *
37480 2a 20 6f 66 20 42 74 43 75 72 73 6f 72 2e 61 70  * of BtCursor.ap
37490 50 61 67 65 5b 5d 20 61 6e 64 20 42 74 43 75 72  Page[] and BtCur
374a0 73 6f 72 2e 61 69 49 64 78 5b 5d 2e 20 49 6e 73  sor.aiIdx[]. Ins
374b0 74 65 61 64 20 6f 66 20 64 6f 69 6e 67 20 74 68  tead of doing th
374c0 61 74 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  at,.  ** set the
374d0 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74 6f   cursor state to
374e0 20 22 69 6e 76 61 6c 69 64 22 2e 20 54 68 69 73   "invalid". This
374f0 20 6d 61 6b 65 73 20 63 6f 6d 6d 6f 6e 20 69 6e   makes common in
37500 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 0a  sert operations.
37510 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 66 61    ** slightly fa
37520 73 74 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ster..  **.  ** 
37530 54 68 65 72 65 20 69 73 20 61 20 73 75 62 74 6c  There is a subtl
37540 65 20 62 75 74 20 69 6d 70 6f 72 74 61 6e 74 20  e but important 
37550 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 68 65 72  optimization her
37560 65 20 74 6f 6f 2e 20 57 68 65 6e 20 69 6e 73 65  e too. When inse
37570 72 74 69 6e 67 0a 20 20 2a 2a 20 6d 75 6c 74 69  rting.  ** multi
37580 70 6c 65 20 72 65 63 6f 72 64 73 20 69 6e 74 6f  ple records into
37590 20 61 6e 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   an intkey b-tre
375a0 65 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  e using a single
375b0 20 63 75 72 73 6f 72 20 28 61 73 20 63 61 6e 0a   cursor (as can.
375c0 20 20 2a 2a 20 68 61 70 70 65 6e 20 77 68 69 6c    ** happen whil
375d0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 20  e processing an 
375e0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 2e 2e 2e  "INSERT INTO ...
375f0 20 53 45 4c 45 43 54 22 20 73 74 61 74 65 6d 65   SELECT" stateme
37600 6e 74 29 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  nt), it.  ** is 
37610 61 64 76 61 6e 74 61 67 65 6f 75 73 20 74 6f 20  advantageous to 
37620 6c 65 61 76 65 20 74 68 65 20 63 75 72 73 6f 72  leave the cursor
37630 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
37640 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 0a 20   last entry in. 
37650 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 69   ** the b-tree i
37660 66 20 70 6f 73 73 69 62 6c 65 2e 20 49 66 20 74  f possible. If t
37670 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
37680 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
37690 65 20 6c 61 73 74 0a 20 20 2a 2a 20 65 6e 74 72  e last.  ** entr
376a0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  y in the table, 
376b0 61 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  and the next row
376c0 20 69 6e 73 65 72 74 65 64 20 68 61 73 20 61 6e   inserted has an
376d0 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 20 20 2a   integer key.  *
376e0 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  * larger than th
376f0 65 20 6c 61 72 67 65 73 74 20 65 78 69 73 74 69  e largest existi
37700 6e 67 20 6b 65 79 2c 20 69 74 20 69 73 20 70 6f  ng key, it is po
37710 73 73 69 62 6c 65 20 74 6f 20 69 6e 73 65 72 74  ssible to insert
37720 20 74 68 65 0a 20 20 2a 2a 20 72 6f 77 20 77 69   the.  ** row wi
37730 74 68 6f 75 74 20 73 65 65 6b 69 6e 67 20 74 68  thout seeking th
37740 65 20 63 75 72 73 6f 72 2e 20 54 68 69 73 20 63  e cursor. This c
37750 61 6e 20 62 65 20 61 20 62 69 67 20 70 65 72 66  an be a big perf
37760 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
37770 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   */.  pCur->info
37780 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
37790 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
377a0 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
377b0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
377c0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
377d0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
377e0 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 75  Cur);..    /* Mu
377f0 73 74 20 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76  st make sure nOv
37800 65 72 66 6c 6f 77 20 69 73 20 72 65 73 65 74 20  erflow is reset 
37810 74 6f 20 7a 65 72 6f 20 65 76 65 6e 20 69 66 20  to zero even if 
37820 74 68 65 20 62 61 6c 61 6e 63 65 28 29 0a 20 20  the balance().  
37830 20 20 2a 2a 20 66 61 69 6c 73 2e 20 49 6e 74 65    ** fails. Inte
37840 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
37850 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ure corruption w
37860 69 6c 6c 20 72 65 73 75 6c 74 20 6f 74 68 65 72  ill result other
37870 77 69 73 65 2e 20 0a 20 20 20 20 2a 2a 20 41 6c  wise. .    ** Al
37880 73 6f 2c 20 73 65 74 20 74 68 65 20 63 75 72 73  so, set the curs
37890 6f 72 20 73 74 61 74 65 20 74 6f 20 69 6e 76 61  or state to inva
378a0 6c 69 64 2e 20 54 68 69 73 20 73 74 6f 70 73 20  lid. This stops 
378b0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
378c0 6f 6e 28 29 0a 20 20 20 20 2a 2a 20 66 72 6f 6d  on().    ** from
378d0 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20   trying to save 
378e0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
378f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 75 72 73  tion of the curs
37900 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 70 43 75 72  or.  */.    pCur
37910 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
37920 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Page]->nOverflow
37930 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
37940 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
37950 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 61  INVALID;.  }.  a
37960 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
37970 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
37980 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
37990 3b 0a 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20  ;..end_insert:. 
379a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
379b0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
379c0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63  entry that the c
379d0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
379e0 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  g to.  The curso
379f0 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
37a00 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62 69 74  nting at a arbit
37a10 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rary location..*
37a20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
37a30 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f  eeDelete(BtCurso
37a40 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
37a50 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74  e *p = pCur->pBt
37a60 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ree;.  BtShared 
37a70 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
37a80 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
37a90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
37aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ab0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37ac0 64 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  de */.  MemPage 
37ad0 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
37ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37af0 50 61 67 65 20 74 6f 20 64 65 6c 65 74 65 20 63  Page to delete c
37b00 65 6c 6c 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 6e  ell from */.  un
37b10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
37b20 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
37b30 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
37b40 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20   cell to delete 
37b50 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 49 64  */.  int iCellId
37b60 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
37b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
37b80 65 78 20 6f 66 20 63 65 6c 6c 20 74 6f 20 64 65  ex of cell to de
37b90 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  lete */.  int iC
37ba0 65 6c 6c 44 65 70 74 68 3b 20 20 20 20 20 20 20  ellDepth;       
37bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37bc0 2a 20 44 65 70 74 68 20 6f 66 20 6e 6f 64 65 20  * Depth of node 
37bd0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 43 65 6c 6c  containing pCell
37be0 20 2a 2f 20 0a 0a 20 20 61 73 73 65 72 74 28 20   */ ..  assert( 
37bf0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
37c00 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
37c10 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
37c20 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
37c30 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
37c40 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
37c50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
37c60 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 61  r->wrFlag );.  a
37c70 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
37c80 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
37c90 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
37ca0 2c 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  , pCur->pKeyInfo
37cb0 21 3d 30 2c 20 32 29 20 29 3b 0a 20 20 61 73 73  !=0, 2) );.  ass
37cc0 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e  ert( !hasReadCon
37cd0 66 6c 69 63 74 73 28 70 2c 20 70 43 75 72 2d 3e  flicts(p, pCur->
37ce0 70 67 6e 6f 52 6f 6f 74 29 20 29 3b 0a 0a 20 20  pgnoRoot) );..  
37cf0 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e  if( NEVER(pCur->
37d00 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
37d10 65 5d 3e 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]>=pCur->apPage
37d20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
37d30 43 65 6c 6c 29 20 0a 20 20 20 7c 7c 20 4e 45 56  Cell) .   || NEV
37d40 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21  ER(pCur->eState!
37d50 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 20  =CURSOR_VALID). 
37d60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
37d70 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a  QLITE_ERROR;  /*
37d80 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 67   Something has g
37d90 6f 6e 65 20 61 77 72 79 2e 20 2a 2f 0a 20 20 7d  one awry. */.  }
37da0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
37db0 73 20 61 20 64 65 6c 65 74 65 20 6f 70 65 72 61  s a delete opera
37dc0 74 69 6f 6e 20 74 6f 20 72 65 6d 6f 76 65 20 61  tion to remove a
37dd0 20 72 6f 77 20 66 72 6f 6d 20 61 20 74 61 62 6c   row from a tabl
37de0 65 20 62 2d 74 72 65 65 2c 0a 20 20 2a 2a 20 69  e b-tree,.  ** i
37df0 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
37e00 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
37e10 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20 62  pen on the row b
37e20 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 20 2a  eing deleted.  *
37e30 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4b  /.  if( pCur->pK
37e40 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  eyInfo==0 ){.   
37e50 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
37e60 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 70 43  lobCursors(p, pC
37e70 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30  ur->info.nKey, 0
37e80 29 3b 0a 20 20 7d 0a 0a 20 20 69 43 65 6c 6c 44  );.  }..  iCellD
37e90 65 70 74 68 20 3d 20 70 43 75 72 2d 3e 69 50 61  epth = pCur->iPa
37ea0 67 65 3b 0a 20 20 69 43 65 6c 6c 49 64 78 20 3d  ge;.  iCellIdx =
37eb0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 43 65   pCur->aiIdx[iCe
37ec0 6c 6c 44 65 70 74 68 5d 3b 0a 20 20 70 50 61 67  llDepth];.  pPag
37ed0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
37ee0 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20 20  [iCellDepth];.  
37ef0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
37f00 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78  (pPage, iCellIdx
37f10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
37f20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  page containing 
37f30 74 68 65 20 65 6e 74 72 79 20 74 6f 20 64 65 6c  the entry to del
37f40 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  ete is not a lea
37f50 66 20 70 61 67 65 2c 20 6d 6f 76 65 0a 20 20 2a  f page, move.  *
37f60 2a 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * the cursor to 
37f70 74 68 65 20 6c 61 72 67 65 73 74 20 65 6e 74 72  the largest entr
37f80 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 74 68  y in the tree th
37f90 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  at is smaller th
37fa0 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65 6e 74 72  an.  ** the entr
37fb0 79 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  y being deleted.
37fc0 20 54 68 69 73 20 63 65 6c 6c 20 77 69 6c 6c 20   This cell will 
37fd0 72 65 70 6c 61 63 65 20 74 68 65 20 63 65 6c 6c  replace the cell
37fe0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 0a 20   being deleted. 
37ff0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e 74   ** from the int
38000 65 72 6e 61 6c 20 6e 6f 64 65 2e 20 54 68 65 20  ernal node. The 
38010 27 70 72 65 76 69 6f 75 73 27 20 65 6e 74 72 79  'previous' entry
38020 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 68 69   is used for thi
38030 73 20 69 6e 73 74 65 61 64 0a 20 20 2a 2a 20 6f  s instead.  ** o
38040 66 20 74 68 65 20 27 6e 65 78 74 27 20 65 6e 74  f the 'next' ent
38050 72 79 2c 20 61 73 20 74 68 65 20 70 72 65 76 69  ry, as the previ
38060 6f 75 73 20 65 6e 74 72 79 20 69 73 20 61 6c 77  ous entry is alw
38070 61 79 73 20 61 20 70 61 72 74 20 6f 66 20 74 68  ays a part of th
38080 65 0a 20 20 2a 2a 20 73 75 62 2d 74 72 65 65 20  e.  ** sub-tree 
38090 68 65 61 64 65 64 20 62 79 20 74 68 65 20 63 68  headed by the ch
380a0 69 6c 64 20 70 61 67 65 20 6f 66 20 74 68 65 20  ild page of the 
380b0 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
380c0 65 64 2e 20 54 68 69 73 20 6d 61 6b 65 73 0a 20  ed. This makes. 
380d0 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 74 68   ** balancing th
380e0 65 20 74 72 65 65 20 66 6f 6c 6c 6f 77 69 6e 67  e tree following
380f0 20 74 68 65 20 64 65 6c 65 74 65 20 6f 70 65 72   the delete oper
38100 61 74 69 6f 6e 20 65 61 73 69 65 72 2e 20 20 2a  ation easier.  *
38110 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  /.  if( !pPage->
38120 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
38130 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 72 63 20  notUsed;.    rc 
38140 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
38150 65 76 69 6f 75 73 28 70 43 75 72 2c 20 26 6e 6f  evious(pCur, &no
38160 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20  tUsed);.    if( 
38170 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
38180 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
38190 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
381a0 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
381b0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
381c0 61 62 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a  able before.  **
381d0 20 6d 61 6b 69 6e 67 20 61 6e 79 20 6d 6f 64 69   making any modi
381e0 66 69 63 61 74 69 6f 6e 73 2e 20 4d 61 6b 65 20  fications. Make 
381f0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
38200 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ing the entry to
38210 20 62 65 20 0a 20 20 2a 2a 20 64 65 6c 65 74 65   be .  ** delete
38220 64 20 77 72 69 74 61 62 6c 65 2e 20 54 68 65 6e  d writable. Then
38230 20 66 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   free any overfl
38240 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
38250 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 20 20  ted with the .  
38260 2a 2a 20 65 6e 74 72 79 20 61 6e 64 20 66 69 6e  ** entry and fin
38270 61 6c 6c 79 20 72 65 6d 6f 76 65 20 74 68 65 20  ally remove the 
38280 63 65 6c 6c 20 69 74 73 65 6c 66 20 66 72 6f 6d  cell itself from
38290 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
382a0 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  .  .  */.  rc = 
382b0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
382c0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
382d0 6f 74 2c 20 70 43 75 72 29 3b 0a 20 20 69 66 28  ot, pCur);.  if(
382e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
382f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
38300 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
38310 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
38320 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
38330 0a 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c  .  rc = clearCel
38340 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  l(pPage, pCell);
38350 0a 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67  .  dropCell(pPag
38360 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63 65 6c  e, iCellIdx, cel
38370 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
38380 70 43 65 6c 6c 29 2c 20 26 72 63 29 3b 0a 20 20  pCell), &rc);.  
38390 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
383a0 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  rc;..  /* If the
383b0 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77 61   cell deleted wa
383c0 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f 6e  s not located on
383d0 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
383e0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20  en the cursor.  
383f0 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
38400 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
38410 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e  largest entry in
38420 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65   the sub-tree he
38430 61 64 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  aded.  ** by the
38440 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20 74   child-page of t
38450 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61 73  he cell that was
38460 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66 72   just deleted fr
38470 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20  om an internal. 
38480 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63 65