/ Hex Artifact Content
Login

Artifact 4076d11eaf78382514707ee7013cb0e2e59c1437:


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 69 6e 74  ntent ){.    int
4500: 20 6e 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20   nPage = 100;.  
4510: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
4520: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
4530: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
4540: 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 50    /* If sqlite3P
4550: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20  agerPagecount() 
4560: 66 61 69 6c 73 20 74 68 65 72 65 20 69 73 20 6e  fails there is n
4570: 6f 20 68 61 72 6d 20 62 65 63 61 75 73 65 20 74  o harm because t
4580: 68 65 0a 20 20 20 20 2a 2a 20 6e 50 61 67 65 20  he.    ** nPage 
4590: 76 61 72 69 61 62 6c 65 20 69 73 20 75 6e 63 68  variable is unch
45a0: 61 6e 67 65 64 20 66 72 6f 6d 20 69 74 73 20 64  anged from its d
45b0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
45c0: 31 30 30 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  100 */.    pBt->
45d0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
45e0: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
45f0: 65 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a 20  e((u32)nPage);. 
4600: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4610: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4620: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4630: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4640: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4650: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4660: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4670: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4680: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4690: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
46a0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
46b0: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
46c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
46d0: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
46e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
46f0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4700: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4710: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4720: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4730: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4740: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4750: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4760: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4770: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4780: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4790: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
47a0: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
47b0: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
47c0: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
47d0: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
47e0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
47f0: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4800: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4810: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4820: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4830: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4840: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4850: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4860: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4870: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4880: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4890: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
48a0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
48b0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
48c0: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
48d0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
48e0: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
48f0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4900: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4910: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4920: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4930: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4940: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4960: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4970: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4980: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4990: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
49a0: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
49b0: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
49c0: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
49d0: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
49e0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
49f0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
4a00: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
4a10: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
4a20: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
4a30: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
4a40: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
4a50: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
4a60: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
4a70: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
4a80: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
4a90: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
4aa0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4ab0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
4ac0: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
4ad0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
4ae0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
4af0: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
4b00: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
4b10: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
4b20: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
4b30: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
4b40: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
4b50: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
4b60: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
4b70: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
4b80: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
4b90: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
4ba0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
4bb0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
4bc0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
4bd0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
4be0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
4bf0: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
4c00: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
4c10: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
4c20: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
4c30: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
4c40: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
4c50: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
4c60: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
4c70: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
4c80: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
4c90: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
4ca0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
4cb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
4cc0: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4cd0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  intKey ){.    vo
4ce0: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
4cf0: 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70  e3Malloc( (int)p
4d00: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
4d10: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
4d20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4d30: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
4d40: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
4d50: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
4d60: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
4d80: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
4d90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4da0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4db0: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
4dc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4dd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4de0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
4df0: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
4e00: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
4e10: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
4e20: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
4e30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
4e40: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
4e50: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
4e60: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
4e70: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
4e80: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
4e90: 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
4ea0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
4eb0: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
4ec0: 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  -1;.    pCur->eS
4ed0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
4ee0: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
4ef0: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
4f00: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
4f10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4f20: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4f30: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
4f40: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
4f50: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
4f60: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
4f70: 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72 6f  e table  with ro
4f80: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
4f90: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
4fa0: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
4fb0: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
4fc0: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
4fd0: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
4fe0: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
4ff0: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5000: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5010: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
5020: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5030: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
5040: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
5050: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
5060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5070: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5080: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
5090: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
50a0: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
50b0: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
50c0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
50d0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
50e0: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
50f0: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
5100: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
5110: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
5120: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
5130: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
5140: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
5150: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
5160: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
5170: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5180: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
51a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
51b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
51c0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
51d0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
51e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
51f0: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5200: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5210: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5220: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5230: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
5240: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
5250: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
5260: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
5270: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
5280: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
5290: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
52a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
52b0: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
52c0: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
52d0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
52e0: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
52f0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5300: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5310: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5320: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5330: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
5340: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
5350: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
5360: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
5370: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
5380: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
5390: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
53a0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
53b0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
53c0: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
53d0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
53e0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
53f0: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5400: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5410: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5420: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5430: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
5440: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
5450: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
5460: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
5470: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
5480: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
5490: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
54a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
54b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
54c0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
54d0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
54e0: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
54f0: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5500: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5510: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5520: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5530: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
5540: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
5550: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69  a malloc */..  i
5560: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5570: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5580: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
5590: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
55a0: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
55b0: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
55c0: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
55d0: 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  pKey,.          
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61              aSpa
5600: 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
5610: 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  e));.    if( pId
5620: 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
5630: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
5650: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5660: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5670: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5680: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
5690: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
56a0: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
56b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
56c0: 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
56d0: 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  rd(pIdxKey);.  }
56e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
56f0: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
5700: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
5710: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
5720: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
5730: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
5740: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
5750: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
5760: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
5770: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
5780: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
5790: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
57a0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
57b0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
57c0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
57d0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
57e0: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
57f0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5800: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
5810: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
5820: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
5830: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
5840: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
5850: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5860: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
58a0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
58b0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
58c0: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
58d0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
58e0: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
58f0: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
5900: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
5910: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
5920: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
5930: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
5940: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
5950: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72  ->nKey, 0, &pCur
5960: 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69  ->skipNext);.  i
5970: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5980: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5990: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
59a0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
59b0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
59c0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
59d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
59e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
59f0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
5a00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5a10: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
5a20: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5a30: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
5a40: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
5a50: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
5a60: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
5a70: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5a80: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
5a90: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
5aa0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
5ab0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
5ac0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
5ad0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
5ae0: 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
5af0: 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73 6f  laced at.  Curso
5b00: 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e  rs can move when
5b10: 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72   the row they ar
5b20: 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74  e pointing.** at
5b30: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20   is deleted out 
5b40: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e  from under them.
5b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5b60: 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ine returns an e
5b70: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d  rror code if som
5b80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5b90: 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67  g.  The.** integ
5ba0: 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73  er *pHasMoved is
5bb0: 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74   set to one if t
5bc0: 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f  he cursor has mo
5bd0: 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74  ved and 0 if not
5be0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5bf0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
5c00: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
5c10: 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76  ur, int *pHasMov
5c20: 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ed){.  int rc;..
5c30: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
5c40: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
5c50: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
5c60: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
5c70: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
5c80: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
5c90: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
5ca0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
5cb0: 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29 7b 0a  >skipNext!=0 ){.
5cc0: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
5cd0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
5ce0: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b   *pHasMoved = 0;
5cf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5d00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
5d10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5d20: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
5d30: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
5d40: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
5d50: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
5d60: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
5d70: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
5d80: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
5d90: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
5da0: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
5db0: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
5dc0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
5dd0: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
5de0: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
5df0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
5e00: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
5e10: 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20  MapPage;.  Pgno 
5e20: 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20  iPtrMap, ret;.  
5e30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5e40: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
5e50: 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67  mutex) );.  nPag
5e60: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
5e70: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
5e80: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
5e90: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
5ea0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
5eb0: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
5ec0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
5ed0: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
5ee0: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
5ef0: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
5f00: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
5f10: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
5f20: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
5f30: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
5f40: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
5f50: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
5f60: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
5f70: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
5f80: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
5f90: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
5fa0: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
5fb0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
5fc0: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
5fd0: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
5fe0: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
5ff0: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
6000: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
6010: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
6020: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
6030: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
6040: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
6050: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
6060: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
6070: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
6080: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
6090: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
60a0: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
60b0: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
60c0: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
60d0: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
60e0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
60f0: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6100: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
6110: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
6120: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
6130: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6140: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
6150: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
6160: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
6170: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
6180: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6190: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
61a0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
61b0: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
61c0: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
61d0: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
61e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
61f0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6200: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
6210: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
6220: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
6230: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
6240: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6250: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
6260: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
6270: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
6280: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
6290: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
62a0: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
62b0: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
62c0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
62d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
62e0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
62f0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
6300: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
6310: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6320: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
6330: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
6340: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
6350: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6360: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
6370: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6380: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
6390: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
63a0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
63b0: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
63c0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
63d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
63e0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
63f0: 69 74 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  it;.  }.  pPtrma
6400: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
6410: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
6420: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
6430: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
6440: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
6450: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6460: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
6470: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
6480: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
6490: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
64a0: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
64b0: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
64c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
64d0: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
64e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
64f0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
6500: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
6510: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
6520: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6530: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
6540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
6550: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
6560: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6570: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
6580: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
6590: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
65a0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
65b0: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
65c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
65d0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
65e0: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
65f0: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
6600: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6610: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
6620: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
6630: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
6640: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
6650: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
6660: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
6670: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
6680: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
6690: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
66a0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
66b0: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
66c0: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
66d0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
66e0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
66f0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
6700: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
6710: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
6720: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
6730: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
6740: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6750: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
6760: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
6770: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
6780: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
6790: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
67a0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
67b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
67c0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
67d0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
67e0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
67f0: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
6800: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
6810: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
6820: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
6830: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6850: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
6860: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
6870: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
6880: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
6890: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
68a0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73  rmap, key);.  as
68b0: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
68c0: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
68d0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
68e0: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
68f0: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
6900: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
6910: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
6920: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6930: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
6940: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
6950: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
6960: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6970: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6980: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
6990: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
69a0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
69b0: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
69c0: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
69d0: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
69e0: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
69f0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
6a00: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
6a10: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
6a20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
6a30: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
6a40: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
6a50: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
6a60: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
6a70: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
6a80: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
6a90: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
6aa0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
6ab0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
6ac0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
6ad0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
6ae0: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
6af0: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
6b00: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
6b10: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
6b20: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
6b30: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
6b40: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
6b50: 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d  & get2byte(&(P)-
6b60: 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c  >aData[(P)->cell
6b70: 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29 29  Offset+2*(I)])))
6b80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
6b90: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
6ba0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
6bb0: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
6bc0: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
6bd0: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
6be0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
6bf0: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
6c00: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
6c10: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
6c20: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
6c30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6c40: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
6c50: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
6c60: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
6c70: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
6c80: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
6c90: 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f   k;.    struct _
6ca0: 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b  OvflCell *pOvfl;
6cb0: 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50  .    pOvfl = &pP
6cc0: 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20  age->aOvfl[i];. 
6cd0: 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64     k = pOvfl->id
6ce0: 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43  x;.    if( k<=iC
6cf0: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
6d00: 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k==iCell ){.   
6d10: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66       return pOvf
6d20: 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  l->pCell;.      
6d30: 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b  }.      iCell--;
6d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6d50: 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  urn findCell(pPa
6d60: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f  ge, iCell);.}../
6d70: 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c  *.** Parse a cel
6d80: 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20  l content block 
6d90: 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  and fill in the 
6da0: 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75  CellInfo structu
6db0: 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72  re.  There.** ar
6dc0: 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  e two versions o
6dd0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
6de0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
6df0: 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63  () takes a .** c
6e00: 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65  ell index as the
6e10: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6e20: 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43   and btreeParseC
6e30: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
6e40: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
6e50: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
6e60: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
6e70: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
6e80: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66  ** Within this f
6e90: 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65  ile, the parseCe
6ea0: 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62  ll() macro can b
6eb0: 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
6ec0: 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73   of.** btreePars
6ed0: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
6ee0: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
6ef0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
6f00: 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aster..*/.static
6f10: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
6f20: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
6f30: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
6f40: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
6f50: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
6f60: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
6f80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
6f90: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
6fa0: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
6fb0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6fc0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
6fd0: 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20  */.){.  u16 n;  
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
7000: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
7010: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
7020: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
7030: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7040: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
7050: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
7060: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7070: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7080: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
7090: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
70a0: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
70b0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
70c0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
70d0: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
70e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
70f0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
7100: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
7110: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
7120: 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
7130: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
7140: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  .      n += getV
7150: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
7160: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
7170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
7180: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
7190: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
71a0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
71b0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
71c0: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
71d0: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
71e0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
71f0: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
7200: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
7210: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
7220: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
7230: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
7240: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
7250: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
7260: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
7270: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
7280: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
7290: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
72a0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
72b0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
72c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
72d0: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
72e0: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
72f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
7300: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
7310: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
7320: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
7330: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
7340: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
7350: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
7360: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
7370: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
7380: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
7390: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
73a0: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
73b0: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
73c0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61  .    nSize = nPa
73d0: 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70  yload + n;.    p
73e0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
73f0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
7400: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
7410: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ow = 0;.    if( 
7420: 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20  (nSize & ~3)==0 
7430: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
7440: 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69   4;        /* Mi
7450: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
7460: 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  is 4 */.    }.  
7470: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7480: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d   (u16)nSize;.  }
7490: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
74a0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
74b0: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
74c0: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
74d0: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
74e0: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
74f0: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7500: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7510: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
7520: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
7530: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
7540: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
7550: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
7560: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
7570: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
7580: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
7590: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
75a0: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
75b0: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
75c0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
75d0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
75e0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
75f0: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7600: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7610: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
7620: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
7630: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
7640: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
7650: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
7660: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
7670: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
7680: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
7690: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
76a0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
76b0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
76c0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
76d0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
76e0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
76f0: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7700: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7710: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
7720: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
7730: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
7740: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7750: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
7760: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
7770: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
7780: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
7790: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
77a0: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
77b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
77c0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
77d0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
77e0: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
77f0: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7800: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
7810: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
7820: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
7830: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7840: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
7850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
7860: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7870: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7880: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7890: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
78a0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
78b0: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
78c0: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
78d0: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
78e0: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
78f0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7900: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74  l, pInfo) \.  bt
7910: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7920: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
7930: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
7940: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74  l)), (pInfo)).st
7950: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7960: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
7970: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
7980: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
7990: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
79a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
79c0: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
79d0: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
79e0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
79f0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
7a00: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
7a10: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
7a20: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
7a30: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
7a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
7a50: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
7a60: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
7a70: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
7a80: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7a90: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
7aa0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
7ab0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
7ac0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
7ad0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
7ae0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
7af0: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
7b00: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
7b10: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
7b20: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
7b30: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
7b40: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
7b50: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
7b60: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
7b70: 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65  u8 *pIter = &pCe
7b80: 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ll[pPage->childP
7b90: 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e  trSize];.  u32 n
7ba0: 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  Size;..#ifdef SQ
7bb0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
7bc0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
7bd0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
7be0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
7bf0: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
7c00: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
7c10: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
7c20: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
7c30: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
7c40: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
7c50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
7c60: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
7c70: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
7c80: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
7c90: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
7ca0: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
7cb0: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
7cc0: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
7cd0: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
7ce0: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
7cf0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
7d00: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
7d10: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
7d20: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
7d30: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
7d40: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
7d50: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
7d60: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
7d70: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
7d80: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7d90: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
7da0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
7db0: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
7dc0: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
7dd0: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
7de0: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
7df0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
7e00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7e10: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
7e20: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
7e30: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
7e40: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
7e50: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
7e60: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
7e70: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
7e80: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
7e90: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
7ea0: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
7eb0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
7ec0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
7ed0: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74  nSize);.  }..  t
7ee0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
7ef0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
7f00: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
7f10: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
7f20: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
7f30: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
7f40: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
7f50: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
7f60: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
7f70: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
7f80: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
7f90: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
7fa0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
7fb0: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
7fc0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
7fd0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
7fe0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
7ff0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8000: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
8010: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
8020: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
8030: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
8040: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
8050: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
8060: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
8070: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
8080: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
8090: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
80a0: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
80b0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
80c0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
80d0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
80e0: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
80f0: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
8100: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
8110: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8120: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
8130: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
8140: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
8150: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
8160: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
8170: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
8180: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
8190: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
81a0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
81b0: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
81c0: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
81d0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
81e0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
81f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8200: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
8210: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
8220: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
8230: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
8240: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8250: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
8260: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
8270: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
8280: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
8290: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
82a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
82b0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
82c0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
82d0: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
82e0: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
82f0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
8300: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8310: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
8320: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8330: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
8340: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
8350: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
8360: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
8370: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
8380: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
8390: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
83a0: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
83b0: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
83c0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
83d0: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
83e0: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
83f0: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
8400: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
8410: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
8420: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
8430: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
8440: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
8450: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
8460: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
8470: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
8480: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
8490: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
84a0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
84b0: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
84c0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
84d0: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
84e0: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
84f0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8500: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8510: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
8520: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
8530: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
8540: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8550: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8560: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8570: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
8580: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8590: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
85a0: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
85d0: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
85e0: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8600: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8610: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
8620: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8630: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
8640: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
8650: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
8660: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
8670: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8680: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
8690: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
86a0: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
86b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
86c0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
86d0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
86e0: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
86f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8700: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8710: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
8720: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8730: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
8740: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
8760: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
8770: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
8780: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
8790: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
87a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
87b0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
87c0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
87d0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
87e0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
87f0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8800: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8810: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8820: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8830: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8840: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8850: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
8860: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
8870: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
8880: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
88a0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
88b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
88c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
88d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
88e0: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
88f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8900: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8910: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
8920: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8930: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
8940: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
8950: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
8960: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
8970: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
8980: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
8990: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
89a0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
89b0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
89c0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
89d0: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
89e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
89f0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
8a00: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
8a10: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
8a20: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
8a30: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
8a40: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
8a50: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
8a60: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
8a70: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
8a80: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
8a90: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
8aa0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
8ab0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
8ac0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
8ad0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
8ae0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
8af0: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
8b00: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
8b10: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8b20: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
8b30: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8b40: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
8b50: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8b60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
8b70: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
8b80: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
8b90: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
8ba0: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
8bb0: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
8bc0: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
8bd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
8be0: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
8bf0: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
8c00: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
8c10: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
8c20: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
8c30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8c40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8c50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8c60: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
8c70: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
8c80: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
8c90: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
8ca0: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
8cb0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
8cc0: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
8cd0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
8ce0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
8cf0: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
8d00: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
8d10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8d20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8d30: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
8d40: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
8d50: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
8d60: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
8d70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8d80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8d90: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
8da0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
8db0: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
8dc0: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
8dd0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
8de0: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
8df0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
8e00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
8e10: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
8e20: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
8e30: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
8e40: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
8e50: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
8e60: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
8e70: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
8e80: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
8e90: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8ea0: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
8eb0: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
8ec0: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
8ed0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
8ee0: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
8ef0: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
8f00: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
8f10: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
8f20: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
8f30: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
8f40: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
8f50: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
8f60: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
8f70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8f80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8f90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
8fa0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8fb0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
8fc0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8fd0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
8fe0: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
8ff0: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9000: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
9010: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
9020: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
9030: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
9040: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
9050: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
9060: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
9070: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
9080: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
9090: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
90a0: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
90b0: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
90c0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
90d0: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
90e0: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
90f0: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
9100: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9110: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
9120: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
9130: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
9140: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
9150: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
9160: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9170: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
9180: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
9190: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
91a0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
91b0: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
91c0: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
91d0: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
91e0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
91f0: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
9200: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
9210: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
9220: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
9230: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
9240: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
9250: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
9260: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
9270: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
9280: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
9290: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
92a0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
92b0: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
92c0: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
92d0: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
92e0: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
92f0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
9300: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
9310: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9330: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9340: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
9350: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
9360: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9390: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
93a0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
93b0: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
93c0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
93d0: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
93e0: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
93f0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
9400: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9410: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
9420: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 0a 20 20  rn code */.  .  
9430: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9440: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9450: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9470: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
9480: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9490: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
94a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
94b0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
94c0: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
94d0: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
94e0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
94f0: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
9500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9510: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
9520: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
9530: 79 74 65 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e  yte<pPage->pBt->
9540: 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a  usableSize-8 );.
9550: 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b  .  nFrag = data[
9560: 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74  hdr+7];.  assert
9570: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
9580: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
9590: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
95a0: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
95b0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
95c0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
95d0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
95e0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
95f0: 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72   if( gap>top ) r
9600: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9610: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73  RUPT_BKPT;.  tes
9620: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
9630: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
9640: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
9650: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
9660: 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46  top );..  if( nF
9670: 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f  rag>=60 ){.    /
9680: 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d  * Always defragm
9690: 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d  ent highly fragm
96a0: 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20  ented pages */. 
96b0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
96c0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
96d0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
96e0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
96f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9700: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65  hdr+5]);.  }else
9710: 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20   if( gap+2<=top 
9720: 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  ){.    /* Search
9730: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
9740: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
9750: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
9760: 20 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20   to satisfy .   
9770: 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e   ** the request.
9780: 20 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   The allocation 
9790: 69 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65  is made from the
97a0: 20 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74   first free slot
97b0: 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
97c0: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72  list that is lar
97d0: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63  ge enough to acc
97e0: 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20  omadate it..    
97f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  */.    int pc, a
9800: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
9810: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
9820: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
9830: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
9840: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
9850: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
9860: 74 61 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f  ta[pc+2]);     /
9870: 2a 20 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73  * Size of free s
9880: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
9890: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
98a0: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
98b0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
98c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
98d0: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  x==4 );.        
98e0: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
98f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
9900: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
9910: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
9920: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
9930: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
9940: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
9950: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
9960: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
9970: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
9980: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64         memcpy(&d
9990: 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61  ata[addr], &data
99a0: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
99b0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
99c0: 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78  = (u8)(nFrag + x
99d0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
99e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
99f0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
9a00: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
9a10: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
9a20: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
9a30: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
9a40: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
9a50: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
9a60: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
9a70: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
9a80: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
9a90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
9aa0: 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20  pIdx = pc + x;. 
9ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9ac0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
9ad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9ae0: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
9af0: 75 72 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f  ure there is eno
9b00: 75 67 68 20 73 70 61 63 65 20 69 6e 20 74 68 65  ugh space in the
9b10: 20 67 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a   gap to satisfy.
9b20: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74    ** the allocat
9b30: 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65  ion.  If not, de
9b40: 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  fragment..  */. 
9b50: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
9b60: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
9b70: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
9b80: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  >top ){.    rc =
9b90: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
9ba0: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
9bb0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9bc0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
9bd0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9be0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
9bf0: 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  p+nByte<=top );.
9c00: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
9c10: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
9c20: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
9c30: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
9c40: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
9c50: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9c60: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
9c70: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
9c80: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
9c90: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
9ca0: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
9cb0: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
9cc0: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
9cd0: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
9ce0: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
9cf0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
9d00: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
9d10: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
9d20: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
9d30: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
9d40: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
9d50: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
9d60: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
9d70: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9d80: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
9d90: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
9da0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9db0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
9dc0: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
9dd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9de0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
9df0: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
9e00: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
9e10: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
9e20: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
9e30: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
9e40: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
9e50: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
9e60: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
9e70: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
9e80: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
9e90: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
9ea0: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
9eb0: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
9ec0: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
9ed0: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
9ee0: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
9ef0: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
9f00: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
9f10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9f20: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
9f30: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
9f40: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69  pbegin, hdr;.  i
9f50: 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20  nt iLast;       
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
9f80: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
9f90: 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ffset */.  unsig
9fa0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
9fb0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
9fc0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9fd0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
9fe0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9ff0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
a000: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
a010: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
a020: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
a030: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
a040: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
a050: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
a060: 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  ze)<=pPage->pBt-
a070: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
a080: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a090: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a0a0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a0b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
a0c0: 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69  >=0 );   /* Mini
a0d0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
a0e0: 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51   4 */..#ifdef SQ
a0f0: 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
a100: 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  TE.  /* Overwrit
a110: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
a120: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
a130: 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52 45   when the SECURE
a140: 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70  _DELETE .  ** op
a150: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
a160: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
a170: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  */.  memset(&dat
a180: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a190: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
a1a0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
a1b0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
a1c0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
a1d0: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68  blocks.  Note th
a1e0: 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  at.  ** even tho
a1f0: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
a200: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
a210: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
a220: 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65  age(),.  ** btre
a230: 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20  eInitPage() did 
a240: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
a250: 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a  apping cells or.
a260: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20    ** freeblocks 
a270: 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20  that overlapped 
a280: 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65  cells.   Nor doe
a290: 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e  s it detect when
a2a0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63   the.  ** cell c
a2b0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65  ontent area exce
a2c0: 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eds the value in
a2d0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
a2e0: 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a  .  If these.  **
a2f0: 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73   situations aris
a300: 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
a310: 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  nt insert operat
a320: 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75  ions might corru
a330: 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  pt.  ** the free
a340: 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20  list.  So we do 
a350: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  need to check fo
a360: 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69  r corruption whi
a370: 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a  le scanning.  **
a380: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
a390: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
a3a0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
a3b0: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
a3c0: 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d    iLast = pPage-
a3d0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a3e0: 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20   - 4;.  assert( 
a3f0: 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  start<=iLast );.
a400: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
a410: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a420: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
a430: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
a440: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64     if( pbegin<ad
a450: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65  dr+4 ){.      re
a460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a470: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
a480: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
a490: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65  n;.  }.  if( pbe
a4a0: 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20  gin>iLast ){.   
a4b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a4c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a4d0: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
a4e0: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
a4f0: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
a500: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
a510: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
a520: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
a530: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
a540: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
a550: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
a560: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
a570: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
a580: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
a590: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
a5a0: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
a5b0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
a5c0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
a5d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a5e0: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
a5f0: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
a600: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
a610: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
a620: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a630: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
a640: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
a650: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
a660: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a670: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
a680: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a690: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
a6a0: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
a6b0: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
a6c0: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
a6d0: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
a6e0: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
a6f0: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  +psize);.      i
a700: 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28  f( (frag<0) || (
a710: 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68  frag>(int)data[h
a720: 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20  dr+7]) ){.      
a730: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a740: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a750: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61      }.      data
a760: 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66  [hdr+7] -= (u8)f
a770: 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  rag;.      x = g
a780: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a790: 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74  ext]);.      put
a7a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
a7b0: 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78  in], x);.      x
a7c0: 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62   = pnext + get2b
a7d0: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
a7e0: 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20  2]) - pbegin;.  
a7f0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
a800: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29  ta[pbegin+2], x)
a810: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a820: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
a830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a840: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
a850: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
a860: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
a870: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
a880: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
a890: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
a8a0: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
a8b0: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
a8c0: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
a8d0: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
a8e0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
a8f0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
a900: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
a910: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
a920: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
a930: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b  (&data[hdr+5]) +
a940: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a950: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
a960: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
a970: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d  dr+5], top);.  }
a980: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a990: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a9a0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a9b0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
a9c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a9d0: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
a9e0: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
a9f0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
aa00: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
aa10: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
aa20: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
aa30: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
aa40: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
aa50: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
aa60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
aa70: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
aa80: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
aa90: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
aaa0: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
aab0: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
aac0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
aad0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
aae0: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
aaf0: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
ab00: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
ab10: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ab20: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
ab30: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
ab40: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
ab50: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
ab60: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
ab70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ab80: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
ab90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
aba0: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
abb0: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
abc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
abd0: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
abe0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
abf0: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
ac00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ac10: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ac20: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
ac30: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
ac40: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
ac50: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
ac60: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
ac70: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
ac80: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
ac90: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
aca0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
acb0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
acc0: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
acd0: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
ace0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
acf0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
ad00: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
ad10: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
ad20: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
ad30: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
ad40: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
ad50: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
ad60: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
ad70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
ad80: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
ad90: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
ada0: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
adb0: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
adc0: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
add0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
ade0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
adf0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
ae00: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
ae10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
ae20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ae30: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
ae40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ae50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
ae60: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
ae70: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
ae80: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
ae90: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
aea0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
aeb0: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
aec0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
aed0: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
aee0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
aef0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
af00: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
af10: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
af20: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
af30: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
af40: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
af50: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
af60: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
af70: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
af80: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
af90: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
afa0: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
afb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
afc0: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
afd0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
afe0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
aff0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b000: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b010: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b020: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b030: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
b040: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
b050: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
b060: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b070: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
b080: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
b090: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
b0a0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
b0b0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
b0c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b0d0: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
b0e0: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
b0f0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
b100: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
b110: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
b120: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
b130: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
b140: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
b150: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
b160: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
b170: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
b180: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
b190: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
b1a0: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
b1b0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
b1c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
b1d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
b1e0: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
b1f0: 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75  ure */.    u16 u
b200: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
b210: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
b220: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
b230: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
b240: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
b250: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
b260: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
b270: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
b280: 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72  r */.    u16 nFr
b290: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
b2a0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
b2b0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
b2c0: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70  e */.    u16 top
b2d0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
b2e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b2f0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b300: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
b310: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
b320: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b330: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
b340: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
b350: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b360: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
b370: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b380: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b390: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
b3a0: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
b3b0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
b3c0: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
b3d0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
b3e0: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
b3f0: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
b400: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
b410: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b420: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
b430: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
b440: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
b450: 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20 70  <=32768 );.    p
b460: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
b470: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
b480: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   1;.    pPage->n
b490: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
b4a0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
b4b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
b4c0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
b4d0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
b4e0: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
b4f0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
b500: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
b510: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b520: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b530: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b540: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b550: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b560: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b570: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b580: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b590: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b5a0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b5b0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b5c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b5d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b5e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b5f0: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b600: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b610: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b620: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b630: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b640: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b650: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b660: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b670: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
b680: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
b690: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
b6a0: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
b6b0: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
b6c0: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
b6d0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
b6e0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
b6f0: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
b700: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
b710: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
b720: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
b730: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
b740: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
b750: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
b760: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
b770: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
b780: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b790: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
b7a0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
b7b0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
b7c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
b7d0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
b7e0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
b7f0: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
b800: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
b810: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
b820: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
b830: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
b840: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
b850: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
b860: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
b870: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
b880: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
b890: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
b8a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b8b0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
b8c0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
b8d0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
b8e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b8f0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
b900: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
b910: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
b920: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b930: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
b940: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
b950: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
b960: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
b970: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b980: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
b990: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
b9a0: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
b9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
b9c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b9d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
b9e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b9f0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ba00: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
ba10: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
ba20: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ba30: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
ba40: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
ba50: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
ba60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ba70: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
ba80: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
ba90: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
baa0: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
bab0: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
bac0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bad0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bae0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
baf0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
bb00: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
bb10: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
bb20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bb30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bb40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
bb50: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
bb60: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bb70: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
bb80: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
bb90: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
bba0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
bbb0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
bbc0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bbd0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
bbe0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
bbf0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
bc00: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
bc10: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bc20: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
bc30: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bc40: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bc50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bc60: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
bc80: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
bc90: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
bca0: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
bcb0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
bcc0: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
bcd0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
bce0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
bcf0: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
bd00: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
bd10: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
bd20: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
bd30: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
bd40: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
bd50: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
bd60: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
bd70: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
bd80: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
bd90: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
bda0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
bdb0: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
bdc0: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
bdd0: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
bde0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
bdf0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
be00: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
be10: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
be20: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
be30: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
be40: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
be50: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
be60: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
be70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
be80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
be90: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
bea0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
beb0: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
bec0: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
bed0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
bee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
bef0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bf00: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
bf10: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
bf20: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
bf30: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
bf40: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
bf50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
bf60: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
bf70: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
bf80: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
bf90: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
bfa0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
bfb0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
bfc0: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
bfd0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
bfe0: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
bff0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c000: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c010: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c020: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c040: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c050: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c060: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c070: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c080: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c090: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c0a0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c0b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c0c0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c0d0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c0e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c0f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c100: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c110: 20 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b   /*memset(&data[
c120: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
c130: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
c140: 2a 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  */.  data[hdr] =
c150: 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
c160: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20  first = hdr + 8 
c170: 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f  + 4*((flags&PTF_
c180: 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a  LEAF)==0 ?1:0);.
c190: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
c1a0: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
c1b0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
c1c0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
c1d0: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
c1e0: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
c1f0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74  age->nFree = pBt
c200: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
c210: 69 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c  irst;.  decodeFl
c220: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
c230: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
c240: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
c250: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c260: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
c270: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
c280: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
c290: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
c2a0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
c2b0: 3d 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67  =32768 );.  pPag
c2c0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
c2d0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
c2e0: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
c2f0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
c300: 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
c310: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
c320: 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
c330: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
c340: 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
c350: 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
c360: 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
c370: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
c380: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
c390: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
c3a0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
c3b0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
c3c0: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
c3d0: 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
c3e0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
c3f0: 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Page);.  pPage->
c400: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
c410: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
c420: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70  age);.  pPage->p
c430: 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
c440: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d  ;.  pPage->pBt =
c450: 20 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70   pBt;.  pPage->p
c460: 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50  gno = pgno;.  pP
c470: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
c480: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
c490: 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74  ? 100 : 0;.  ret
c4a0: 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f  urn pPage; .}../
c4b0: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
c4c0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20  from the pager. 
c4d0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
c4e0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
c4f0: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
c500: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
c510: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ded..**.** If th
c520: 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
c530: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
c540: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
c550: 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74   care about.** t
c560: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
c570: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
c580: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
c590: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
c5a0: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
c5b0: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
c5c0: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
c5d0: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
c5e0: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
c5f0: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
c600: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
c610: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
c620: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
c630: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
c640: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
c650: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
c660: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
c670: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
c680: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
c690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
c6a0: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
c6b0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
c6c0: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
c6d0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
c6e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c6f0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
c700: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
c710: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
c720: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
c730: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
c740: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
c750: 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
c760: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61     /* Do not loa
c770: 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  d page content i
c780: 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69  f true */.){.  i
c790: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
c7a0: 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
c7b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c7c0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
c7d0: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
c7e0: 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
c7f0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
c800: 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
c810: 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65  pDbPage, noConte
c820: 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  nt);.  if( rc ) 
c830: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
c840: 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
c850: 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
c860: 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
c870: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c880: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
c890: 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
c8a0: 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
c8b0: 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
c8c0: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
c8d0: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
c8e0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
c8f0: 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
c900: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
c910: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
c920: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
c930: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
c940: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
c950: 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
c960: 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
c970: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
c980: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
c990: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c9a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
c9b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
c9c0: 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
c9d0: 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
c9e0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
c9f0: 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
ca00: 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
ca10: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
ca20: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
ca30: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
ca40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
ca50: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
ca60: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
ca70: 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
ca80: 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
ca90: 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
caa0: 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
cab0: 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
cac0: 69 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67  ic Pgno pagerPag
cad0: 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
cae0: 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61  *pBt){.  int nPa
caf0: 67 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72  ge = -1;.  int r
cb00: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  c;.  assert( pBt
cb10: 2d 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63  ->pPage1 );.  rc
cb20: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
cb30: 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
cb40: 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
cb50: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
cb60: 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d  ITE_OK || nPage=
cb70: 3d 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  =-1 );.  return 
cb80: 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a  (Pgno)nPage;.}..
cb90: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
cba0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
cbb0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
cbc0: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
cbd0: 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f   is just a.** co
cbe0: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
cbf0: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
cc00: 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  e calls to btree
cc10: 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a  GetPage() and .*
cc20: 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
cc30: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  )..**.** If an e
cc40: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
cc50: 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50  n the value *ppP
cc60: 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73  age is set to is
cc70: 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a   undefined. It.*
cc80: 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63  * may remain unc
cc90: 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61  hanged, or it ma
cca0: 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69  y be set to an i
ccb0: 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f  nvalid value..*/
ccc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
ccd0: 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
cce0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
ccf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
cd00: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
cd10: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
cd20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cd30: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
cd40: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
cd50: 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57  *ppPage     /* W
cd60: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
cd70: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b  inter here */.){
cd80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 45 53  .  int rc;.  TES
cd90: 54 4f 4e 4c 59 28 20 50 67 6e 6f 20 69 4c 61 73  TONLY( Pgno iLas
cda0: 74 50 67 20 3d 20 70 61 67 65 72 50 61 67 65 63  tPg = pagerPagec
cdb0: 6f 75 6e 74 28 70 42 74 29 3b 20 29 0a 20 20 61  ount(pBt); ).  a
cdc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
cdd0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
cde0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 72 63 20 3d  utex) );..  rc =
cdf0: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
ce00: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
ce10: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
ce20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ce30: 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
ce40: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
ce50: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ce60: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
ce70: 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
ce80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
ce90: 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
cea0: 65 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 77  ed page number w
ceb0: 61 73 20 65 69 74 68 65 72 20 30 20 6f 72 20 67  as either 0 or g
cec0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
ced0: 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
cee0: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 70 61 67   of the last pag
cef0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
cf00: 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
cf10: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 20   should return. 
cf20: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   ** SQLITE_CORRU
cf30: 50 54 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  PT or some other
cf40: 20 65 72 72 6f 72 20 28 69 2e 65 2e 20 53 51 4c   error (i.e. SQL
cf50: 49 54 45 5f 46 55 4c 4c 29 2e 20 43 68 65 63 6b  ITE_FULL). Check
cf60: 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
cf70: 69 73 20 74 68 65 20 63 61 73 65 2e 20 20 2a 2f  is the case.  */
cf80: 0a 20 20 61 73 73 65 72 74 28 20 28 70 67 6e 6f  .  assert( (pgno
cf90: 3e 30 20 26 26 20 70 67 6e 6f 3c 3d 69 4c 61 73  >0 && pgno<=iLas
cfa0: 74 50 67 29 20 7c 7c 20 72 63 21 3d 53 51 4c 49  tPg) || rc!=SQLI
cfb0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 74 65 73 74 63  TE_OK );.  testc
cfc0: 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
cfd0: 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
cfe0: 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 0a 20 20  ==iLastPg );..  
cff0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
d000: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
d010: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
d020: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
d030: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
d040: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72  r.** call to btr
d050: 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74  eeGetPage..*/.st
d060: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
d070: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
d080: 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  Page){.  if( pPa
d090: 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ge ){.    assert
d0a0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
d0b0: 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ow==0 || sqlite3
d0c0: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
d0d0: 74 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  t(pPage->pDbPage
d0e0: 29 3e 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  )>1 );.    asser
d0f0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
d100: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d110: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
d120: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d130: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
d140: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
d150: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
d160: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
d170: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
d180: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d190: 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
d1a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
d1b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d1c0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d1d0: 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
d1e0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
d1f0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
d200: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  }.}../*.** Durin
d210: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
d220: 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
d230: 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
d240: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
d250: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
d260: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
d270: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
d280: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
d290: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
d2a0: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
d2b0: 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
d2c0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
d2d0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
d2e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
d2f0: 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
d300: 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
d310: 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
d320: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
d330: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
d340: 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
d350: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
d360: 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
d370: 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
d380: 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
d390: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
d3a0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
d3b0: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
d3c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d3d0: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
d3e0: 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
d3f0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
d400: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
d410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d420: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d430: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
d440: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
d450: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
d460: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
d470: 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
d480: 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
d490: 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
d4a0: 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
d4b0: 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
d4c0: 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
d4d0: 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
d4e0: 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
d4f0: 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
d500: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
d510: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
d520: 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
d530: 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
d540: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
d550: 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
d560: 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
d570: 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
d580: 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
d590: 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
d5a0: 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
d5b0: 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
d5c0: 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
d5d0: 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
d5e0: 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
d5f0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
d600: 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
d610: 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
d620: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
d630: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
d640: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
d650: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
d660: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
d670: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
d680: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
d690: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
d6a0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
d6b0: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
d6c0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
d6d0: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
d6e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d6f0: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
d700: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
d710: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
d720: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
d730: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
d740: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
d750: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
d760: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
d770: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d780: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
d790: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
d7a0: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
d7b0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
d7c0: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
d7d0: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
d7e0: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
d7f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
d800: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
d810: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
d820: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
d830: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
d840: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
d850: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
d860: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
d870: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
d880: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
d890: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
d8a0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
d8b0: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
d8c0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
d8d0: 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
d8e0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
d8f0: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
d900: 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
d910: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
d920: 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
d930: 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
d940: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
d950: 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
d960: 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
d970: 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
d980: 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
d990: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d9a0: 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
d9b0: 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
d9c0: 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
d9d0: 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
d9e0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
d9f0: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
da00: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
da10: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
da20: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
da30: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
da40: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
da50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
da60: 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
da70: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
da80: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
da90: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
daa0: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
dab0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
dac0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
dad0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
dae0: 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
daf0: 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
db00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
db10: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
db20: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
db30: 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
db40: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
db50: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
db60: 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65  * The VFS to use
db70: 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20   for this btree 
db80: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
db90: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
dba0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
dbb0: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
dbc0: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
dbd0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
dbe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
dbf0: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
dc00: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
dc10: 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
dc20: 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
dc30: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
dc40: 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
dc50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dc60: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
dc70: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
dc80: 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
dc90: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
dca0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
dcb0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
dcc0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
dcd0: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
dce0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
dcf0: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
dd00: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
dd10: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
dd20: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
dd30: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
dd40: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
dd50: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
dd60: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
dd70: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
dd80: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
dd90: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
dda0: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
ddb0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
ddc0: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
ddd0: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
dde0: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
ddf0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
de00: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
de10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
de20: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
de30: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
de40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
de50: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
de60: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
de70: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
de80: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
de90: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
dea0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
deb0: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
dec0: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
ded0: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
dee0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
def0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
df00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
df10: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
df20: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66  mutex) );..  pVf
df30: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
df40: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
df50: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
df60: 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
df70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
df80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
df90: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
dfa0: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
dfb0: 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
dfc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
dfd0: 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
dfe0: 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
dff0: 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
e000: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
e010: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e020: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
e030: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
e040: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
e050: 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
e060: 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
e070: 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
e080: 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
e090: 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
e0a0: 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
e0b0: 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
e0c0: 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
e0d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65  .  */.  if( isMe
e0e0: 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e  mdb==0 && zFilen
e0f0: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
e100: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 76  [0] ){.    if( v
e110: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
e120: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
e130: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
e140: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
e150: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
e160: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
e170: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e180: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
e190: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e1a0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e1b0: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20   *mutexShared;. 
e1c0: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
e1d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
e1e0: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
e1f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e200: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
e210: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e220: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
e230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
e240: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
e250: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75  , zFilename, nFu
e260: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
e270: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e280: 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
e290: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
e2a0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
e2b0: 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
e2c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
e2d0: 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
e2e0: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
e2f0: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
e300: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
e310: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
e320: 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
e330: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
e340: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
e350: 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
e360: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
e370: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
e380: 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
e390: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
e3a0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
e3b0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
e3c0: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
e3d0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
e3e0: 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
e3f0: 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  me(pBt->pPager))
e400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e410: 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
e420: 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
e430: 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
e440: 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
e450: 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
e460: 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
e470: 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
e480: 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
e490: 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
e4a0: 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
e4b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
e4c0: 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
e4d0: 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e4f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e500: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
e510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e520: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e530: 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
e540: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e550: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
e560: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
e570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e580: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
e590: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e5a0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e5c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e5d0: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
e5e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
e5f0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
e600: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e610: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e620: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e630: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
e640: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
e650: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
e660: 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
e670: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
e680: 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
e690: 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
e6a0: 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
e6b0: 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
e6c0: 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
e6d0: 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
e6e0: 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
e6f0: 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
e700: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
e710: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
e720: 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
e730: 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
e740: 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
e750: 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
e760: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
e770: 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
e780: 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
e790: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
e7a0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
e7b0: 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
e7c0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
e7d0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
e7e0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
e7f0: 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
e800: 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
e810: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
e820: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
e830: 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
e840: 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
e850: 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
e860: 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
e870: 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
e880: 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
e890: 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
e8a0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
e8b0: 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
e8c0: 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d   || sizeof(i64)=
e8d0: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
e8e0: 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
e8f0: 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d   || sizeof(u64)=
e900: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
e910: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
e920: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e930: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
e940: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
e950: 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
e960: 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
e970: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
e980: 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
e990: 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
e9a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
e9b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e9c0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
e9d0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
e9e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e9f0: 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
ea00: 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
ea10: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
ea40: 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
ea50: 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
ea60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ea70: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
ea80: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
ea90: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
eaa0: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
eab0: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
eac0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
ead0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
eae0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
eaf0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
eb00: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d   }.    pBt->db =
eb10: 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
eb20: 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
eb30: 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
eb40: 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
eb50: 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
eb60: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
eb70: 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
eb80: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
eb90: 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
eba0: 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79     pBt->readOnly
ebb0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49   = sqlite3PagerI
ebc0: 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
ebd0: 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d  Pager);.    pBt-
ebe0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32  >pageSize = get2
ebf0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
ec00: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42  16]);.    if( pB
ec10: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
ec20: 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
ec30: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
ec40: 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
ec50: 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
ec60: 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
ec70: 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
ec80: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
ec90: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
eca0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
ecb0: 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
ecc0: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
ecd0: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
ece0: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
ecf0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
ed00: 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
ed10: 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
ed20: 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
ed30: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
ed40: 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
ed50: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
ed60: 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
ed70: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
ed80: 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
ed90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
eda0: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
edb0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
edc0: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
edd0: 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
ede0: 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
edf0: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
ee00: 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
ee10: 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
ee20: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
ee30: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
ee40: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
ee50: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
ee60: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
ee70: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
ee80: 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
ee90: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
eea0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
eeb0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
eec0: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
eed0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
eee0: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
eef0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ef00: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
ef10: 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
ef20: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
ef30: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
ef40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
ef50: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
ef60: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
ef70: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
ef80: 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
ef90: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
efa0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
efb0: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
efc0: 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
efd0: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
efe0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
eff0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
f000: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
f010: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
f020: 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
f030: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
f040: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
f050: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
f060: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
f070: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
f080: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
f090: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
f0a0: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
f0b0: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
f0c0: 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
f0d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f0e0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
f0f0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
f100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
f110: 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
f120: 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
f130: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
f140: 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
f150: 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
f160: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
f170: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
f180: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
f190: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
f1a0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
f1b0: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
f1c0: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
f1d0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
f1e0: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
f1f0: 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  ER);.      if( S
f200: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
f210: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
f220: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
f230: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
f240: 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
f250: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
f260: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
f270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
f280: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
f290: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f2a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
f2b0: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
f2c0: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  ailed = 0;.     
f2d0: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
f2e0: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
f2f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f300: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f310: 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
f320: 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
f330: 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
f340: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
f350: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
f360: 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
f370: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
f380: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
f390: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
f3a0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f3b0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
f3c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
f3d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
f3e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
f3f0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
f400: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f410: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
f420: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
f430: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
f440: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
f450: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
f460: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
f470: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
f480: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
f490: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
f4a0: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
f4b0: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
f4c0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
f4d0: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
f4e0: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
f4f0: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
f500: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
f510: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
f520: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f530: 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
f540: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
f550: 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
f560: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
f570: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
f580: 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
f590: 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
f5a0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
f5b0: 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
f5c0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
f5d0: 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
f5e0: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
f5f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
f600: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
f610: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f620: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
f630: 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
f640: 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
f650: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
f660: 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
f670: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
f680: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
f690: 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
f6a0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
f6b0: 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
f6c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
f6d0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
f6e0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
f6f0: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
f700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f710: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
f720: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f730: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f740: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
f750: 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
f760: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
f770: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
f780: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f790: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
f7a0: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
f7b0: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
f7c0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
f7d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
f7e0: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
f7f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
f800: 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
f810: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75   0;.  }.  if( mu
f820: 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
f830: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f840: 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
f850: 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
f860: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f870: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
f880: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f890: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
f8a0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
f8b0: 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
f8c0: 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
f8d0: 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
f8e0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
f8f0: 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
f900: 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
f910: 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
f920: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
f930: 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
f940: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
f950: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
f960: 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
f970: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
f980: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
f990: 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
f9a0: 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
f9b0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
f9c0: 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f  CACHE.  sqlite3_
f9d0: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a  mutex *pMaster;.
f9e0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
f9f0: 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
fa00: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
fa10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
fa20: 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
fa30: 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20  x) );.  pMaster 
fa40: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
fa50: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
fa60: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
fa70: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fa80: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
fa90: 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
faa0: 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
fab0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
fac0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
fad0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
fae0: 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
faf0: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
fb00: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fb10: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
fb20: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
fb30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
fb40: 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
fb50: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fb60: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
fb70: 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
fb80: 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
fb90: 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
fba0: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
fbb0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
fbc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
fbd0: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
fbe0: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
fbf0: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
fc00: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
fc10: 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
fc20: 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
fc30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fc40: 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
fc50: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
fc60: 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
fc70: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fc80: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
fc90: 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
fca0: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
fcb0: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
fcc0: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
fcd0: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
fce0: 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
fcf0: 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
fd00: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
fd10: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
fd20: 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
fd30: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
fd40: 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
fd50: 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
fd60: 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
fd70: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
fd80: 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
fd90: 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Size );.  }.}../
fda0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
fdb0: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
fdc0: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
fdd0: 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
fde0: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
fdf0: 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
fe00: 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
fe10: 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
fe20: 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
fe30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
fe40: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
fe50: 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
fe60: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
fe70: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
fe80: 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
fe90: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
fea0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
feb0: 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
fec0: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
fed0: 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
fee0: 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
fef0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ff00: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
ff10: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
ff20: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
ff30: 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
ff40: 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
ff50: 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
ff60: 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
ff70: 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
ff80: 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
ff90: 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
ffa0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
ffb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
ffc0: 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
ffd0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ffe0: 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
fff0: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
10000 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
10010 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
10020 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
10030 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
10040 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
10050 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
10060 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
10070 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
10080 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
10090 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ck(p);.  sqlite3
100a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
100b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
100c0 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
100d0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
100e0 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
100f0 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
10100 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
10110 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
10120 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
10130 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
10140 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
10150 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
10160 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
10170 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
10180 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
10190 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
101a0 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
101b0 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
101c0 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
101d0 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
101e0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
101f0 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
10200 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
10210 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
10220 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
10230 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
10240 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
10250 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
10260 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
10270 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
10280 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
10290 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
102a0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
102b0 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
102c0 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
102d0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42  hema ){.      pB
102e0 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
102f0 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
10300 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
10310 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d  free(pBt->pSchem
10320 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
10330 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
10340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
10350 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
10360 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10370 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
10380 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
10390 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
103a0 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
103b0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
103c0 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
103d0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
103e0 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
103f0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
10400 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
10410 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
10420 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
10430 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10440 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
10450 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
10460 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
10470 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
10480 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
10490 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
104a0 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
104b0 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
104c0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
104d0 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
104e0 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
104f0 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
10500 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
10510 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
10520 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
10530 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
10540 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
10550 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
10560 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
10570 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
10580 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
10590 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
105a0 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
105b0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
105c0 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
105d0 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
105e0 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
105f0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
10600 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
10610 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
10620 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
10630 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
10640 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
10650 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
10660 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
10670 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
10680 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
10690 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
106a0 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
106b0 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
106c0 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
106d0 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
106e0 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
106f0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
10700 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
10710 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
10720 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
10730 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
10740 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
10750 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10760 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
10770 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10780 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
10790 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
107a0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
107b0 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
107c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
107d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
107e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
107f0 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
10800 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
10810 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
10820 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
10830 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
10840 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
10850 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
10860 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
10870 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
10880 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
10890 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
108a0 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
108b0 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
108c0 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
108d0 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
108e0 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
108f0 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
10900 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
10910 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
10920 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
10930 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
10940 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
10950 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
10960 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
10970 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
10980 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
10990 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
109a0 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
109b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
109c0 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
109d0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
109e0 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20  fetyLevel(Btree 
109f0 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  *p, int level, i
10a00 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20  nt fullSync){.  
10a10 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
10a20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
10a30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10a40 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
10a50 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
10a60 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
10a70 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
10a80 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
10a90 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
10aa0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69  ullSync);.  sqli
10ab0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10ac0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10ad0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
10ae0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
10af0 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
10b00 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
10b10 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
10b20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
10b30 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
10b40 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
10b50 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
10b60 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
10b70 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
10b80 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
10b90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10ba0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
10bb0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
10bc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10bd0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
10be0 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74  );  .  sqlite3Bt
10bf0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
10c00 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42  ssert( pBt && pB
10c10 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72  t->pPager );.  r
10c20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10c30 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  Nosync(pBt->pPag
10c40 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  er);.  sqlite3Bt
10c50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
10c60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
10c70 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10c80 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
10c90 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
10ca0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
10cb0 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  UUM)./*.** Chang
10cc0 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
10cd0 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
10ce0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
10cf0 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
10d00 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  ge..** Or, if th
10d10 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20  e page size has 
10d20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78  already been fix
10d30 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
10d40 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77  E_READONLY .** w
10d50 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
10d60 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  anything..**.** 
10d70 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75  The page size mu
10d80 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
10d90 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61   2 between 512 a
10da0 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68  nd 65536.  If th
10db0 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73  e page.** size s
10dc0 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74  upplied does not
10dd0 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74   meet this const
10de0 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70  raint then the p
10df0 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  age size is not.
10e00 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a  ** changed..**.*
10e10 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65  * Page sizes are
10e20 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20   constrained to 
10e30 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  be a power of tw
10e40 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  o so that the re
10e50 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64  gion.** of the d
10e60 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65  atabase file use
10e70 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62  d for locking (b
10e80 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44  eginning at PEND
10e90 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65  ING_BYTE,.** the
10ea0 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74   first byte past
10eb0 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72   the 1GB boundar
10ec0 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e  y, 0x40000000) n
10ed0 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a  eeds to occur.**
10ee0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
10ef0 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  g of a page..**.
10f00 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
10f10 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73  nReserve is less
10f20 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
10f30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
10f40 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73  eserved.** bytes
10f50 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66   per page is lef
10f60 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
10f70 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d  ** If the iFix!=
10f80 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 53  0 then the pageS
10f90 69 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69 73  izeFixed flag is
10fa0 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
10fb0 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
10fc0 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
10fd0 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
10fe0 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
10ff0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
11000 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
11010 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
11020 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
11030 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
11040 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11050 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
11060 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11070 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
11080 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
11090 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
110a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
110b0 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
110c0 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73  zeFixed ){.    s
110d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
110e0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
110f0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
11100 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
11110 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
11120 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
11130 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
11140 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
11150 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
11160 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
11170 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
11180 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
11190 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
111a0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
111b0 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
111c0 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
111d0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
111e0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
111f0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
11200 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
11210 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
11220 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
11230 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67  eSize = (u16)pag
11240 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
11250 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
11260 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
11270 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
11280 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
11290 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
112a0 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
112b0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
112c0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
112d0 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
112e0 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70  f( iFix ) pBt->p
112f0 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31  ageSizeFixed = 1
11300 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11310 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11320 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11330 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
11340 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67  ntly defined pag
11350 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  e size.*/.int sq
11360 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
11370 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b  eSize(Btree *p){
11380 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
11390 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
113a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
113b0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
113c0 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
113d0 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
113e0 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
113f0 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
11400 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
11410 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
11420 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
11430 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
11440 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f  y extensions..*/
11450 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11460 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65  eGetReserve(Btre
11470 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  e *p){.  int n;.
11480 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11490 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d  ter(p);.  n = p-
114a0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
114b0 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
114c0 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ize;.  sqlite3Bt
114d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
114e0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
114f0 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
11500 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
11510 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
11520 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
11530 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
11540 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
11550 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
11560 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
11570 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
11580 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
11590 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
115a0 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
115b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
115c0 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
115d0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
115e0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
115f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11600 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
11610 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
11620 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
11630 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
11640 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11650 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
11660 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
11670 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
11680 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
11690 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
116a0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
116b0 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
116c0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
116d0 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
116e0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
116f0 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
11700 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
11710 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
11720 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
11730 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
11740 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
11750 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
11760 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
11770 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
11780 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
11790 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
117a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
117b0 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
117c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
117d0 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
117e0 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
117f0 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
11800 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11810 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
11820 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
11830 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
11840 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11850 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
11860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
11870 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
11880 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
11890 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
118a0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
118b0 65 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31  eFixed && (av ?1
118c0 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
118d0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
118e0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
118f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
11900 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
11910 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
11920 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
11930 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
11940 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11950 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11960 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
11970 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11980 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
11990 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
119a0 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
119b0 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
119c0 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
119d0 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
119e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
119f0 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
11a00 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
11a10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11a20 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
11a30 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
11a40 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
11a50 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
11a60 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11a70 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
11a80 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
11a90 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
11aa0 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
11ab0 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
11ac0 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
11ad0 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
11ae0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
11af0 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
11b00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11b10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11b20 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
11b30 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
11b40 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
11b50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11b60 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
11b70 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
11b80 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
11b90 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
11ba0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11bb0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
11bc0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
11bd0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
11be0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
11bf0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
11c00 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
11c10 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
11c20 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
11c30 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
11c40 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
11c50 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
11c60 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
11c70 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
11c80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
11c90 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
11ca0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
11cb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
11cc0 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b  e1;.  int nPage;
11cd0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
11ce0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11cf0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11d00 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
11d10 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
11d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
11d30 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
11d40 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
11d50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
11d60 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74  rn rc;.  rc = bt
11d70 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
11d80 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
11d90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11da0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
11db0 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
11dc0 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
11dd0 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
11de0 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
11df0 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
11e00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11e10 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
11e20 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
11e30 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
11e40 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
11e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11e60 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
11e70 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65  nit_failed;.  }e
11e80 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20  lse if( nPage>0 
11e90 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53  ){.    int pageS
11ea0 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61  ize;.    int usa
11eb0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
11ec0 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
11ed0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
11ee0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
11ef0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
11f00 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
11f10 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
11f20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
11f30 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
11f40 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
11f50 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
11f60 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
11f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11f80 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
11f90 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
11fa0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
11fb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d   }..    /* The m
11fc0 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  aximum embedded 
11fd0 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
11fe0 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41   exactly 25%.  A
11ff0 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20  nd the minimum. 
12000 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66     ** embedded f
12010 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
12020 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c  12.5% for both l
12030 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e  eaf-data and non
12040 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20  -leaf-data..    
12050 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
12060 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
12070 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
12080 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
12090 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
120a0 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
120b0 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
120c0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
120d0 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
120e0 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
120f0 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
12100 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
12110 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12120 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
12130 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b  get2byte(&page1[
12140 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28  16]);.    if( ((
12150 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
12160 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65  Size)!=0 || page
12170 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20  Size<512 ||.    
12180 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f      (SQLITE_MAX_
12190 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20  PAGE_SIZE<32768 
121a0 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  && pageSize>SQLI
121b0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
121c0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
121d0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
121e0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
121f0 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
12200 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
12210 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
12220 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
12230 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67  20];.    if( pag
12240 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
12250 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
12260 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
12270 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
12280 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
12290 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
122a0 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
122b0 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
122c0 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
122d0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
122e0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
122f0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
12300 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
12310 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
12320 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
12330 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
12340 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
12350 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
12360 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
12370 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
12380 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
12390 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
123a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
123b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
123c0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
123d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28  ->usableSize = (
123e0 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u16)usableSize;.
123f0 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
12400 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53  ize = (u16)pageS
12410 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
12420 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
12430 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12440 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
12450 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
12460 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  pBt->pageSize,. 
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c    pageSize-usabl
124a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
124b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
124c0 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
124d0 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
124e0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
124f0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
12500 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
12510 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
12520 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
12530 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c  ize = (u16)usabl
12540 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
12550 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12560 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
12570 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
12580 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
12590 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
125a0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
125b0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
125c0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
125d0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
125e0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
125f0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
12600 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
12610 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
12620 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
12630 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
12640 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
12650 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
12660 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
12670 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
12680 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
12690 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
126a0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
126b0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
126c0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
126d0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
126e0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
126f0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
12700 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
12710 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
12720 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
12730 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
12740 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
12750 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
12760 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
12770 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
12780 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
12790 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
127a0 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68  byte poiner, a h
127b0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
127c0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
127d0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
127e0 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
127f0 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
12800 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
12810 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
12820 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
12830 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
12840 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
12850 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
12860 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  3;.  pBt->minLoc
12870 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
12880 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
12890 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61   - 23;.  pBt->ma
128a0 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61  xLeaf = pBt->usa
128b0 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20  bleSize - 35;.  
128c0 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
128d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
128e0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
128f0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
12900 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
12910 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
12920 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
12930 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72  e1 = pPage1;.  r
12940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12950 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
12960 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
12970 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
12980 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
12990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
129a0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
129b0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
129c0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
129d0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
129e0 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
129f0 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
12a00 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
12a10 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
12a20 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
12a30 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
12a40 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
12a50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
12a60 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
12a70 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
12a80 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
12a90 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
12aa0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
12ab0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
12ac0 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
12ad0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12ae0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
12af0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
12b00 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
12b10 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
12b20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12b30 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
12b40 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75  assert( pBt->pCu
12b50 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  rsor==0 || pBt->
12b60 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
12b70 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
12b80 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
12b90 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
12ba0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
12bb0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
12bc0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
12bd0 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
12be0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
12bf0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
12c00 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20  ager)==1 );.    
12c10 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
12c20 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
12c30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
12c40 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
12c50 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
12c60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
12c70 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
12c80 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
12c90 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
12ca0 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
12cb0 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
12cc0 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
12cd0 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
12ce0 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
12cf0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
12d00 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
12d10 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
12d20 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
12d30 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
12d40 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
12d50 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65   rc;.  int nPage
12d60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
12d70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12d80 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12d90 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
12da0 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
12db0 79 20 62 65 65 6e 20 6d 65 61 73 75 72 65 64 20  y been measured 
12dc0 61 6e 64 20 63 61 63 68 65 64 2c 20 73 6f 20 66  and cached, so f
12dd0 61 69 6c 75 72 65 0a 20 20 2a 2a 20 69 73 20 69  ailure.  ** is i
12de0 6d 70 6f 73 73 69 62 6c 65 20 68 65 72 65 2e 20  mpossible here. 
12df0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
12e00 20 73 69 7a 65 20 6d 65 61 73 75 72 65 6d 65 6e   size measuremen
12e10 74 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 0a 20  t failed, then. 
12e20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 61   ** processing a
12e30 62 6f 72 74 73 20 62 65 66 6f 72 65 20 65 6e 74  borts before ent
12e40 65 72 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  ering this routi
12e50 6e 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ne. */.  rc = sq
12e60 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12e70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
12e80 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
12e90 4e 45 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45  NEVER(rc!=SQLITE
12ea0 5f 4f 4b 29 20 7c 7c 20 6e 50 61 67 65 3e 30 20  _OK) || nPage>0 
12eb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
12ec0 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
12ed0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
12ee0 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
12ef0 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
12f00 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
12f10 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
12f20 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
12f30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12f40 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
12f50 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
12f60 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
12f70 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
12f80 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
12f90 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75  der)==16 );.  pu
12fa0 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d  t2byte(&data[16]
12fb0 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
12fc0 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
12fd0 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
12fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
12ff0 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
13000 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
13010 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
13020 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
13030 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
13040 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
13050 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
13060 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
13070 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
13080 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
13090 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
130a0 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
130b0 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
130c0 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
130d0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
130e0 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
130f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
13100 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ed = 1;.#ifndef 
13110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13120 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
13130 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13140 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
13150 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
13160 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
13170 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
13180 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
13190 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
131a0 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
131b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
131c0 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
131d0 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
131e0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
131f0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
13200 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13210 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
13220 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
13230 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
13240 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
13250 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
13260 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
13270 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
13280 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
13290 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
132a0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
132b0 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
132c0 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
132d0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
132e0 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
132f0 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
13300 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
13310 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
13320 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
13330 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
13340 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
13350 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
13360 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
13370 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
13380 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
13390 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
133a0 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
133b0 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
133c0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
133d0 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
133e0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
133f0 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
13400 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
13410 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
13420 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
13430 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
13440 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
13450 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
13460 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
13470 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
13480 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
13490 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
134a0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
134b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
134c0 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
134d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
134e0 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
134f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
13500 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
13510 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
13520 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
13530 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
13540 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
13550 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
13560 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
13570 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
13580 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
13590 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
135a0 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
135b0 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
135c0 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
135d0 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
135e0 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
135f0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
13600 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
13610 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
13620 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
13630 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
13640 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
13650 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
13660 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
13670 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
13680 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
13690 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
136a0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
136b0 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
136c0 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
136d0 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
136e0 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
136f0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
13700 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
13710 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
13720 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
13730 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
13740 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
13750 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
13760 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
13770 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
13780 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
13790 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
137a0 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
137b0 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
137c0 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
137d0 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
137e0 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
137f0 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
13800 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
13810 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
13820 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
13830 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
13840 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
13850 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
13860 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
13870 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
13880 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
13890 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
138a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
138b0 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
138c0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
138d0 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  flag){.  sqlite3
138e0 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
138f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13900 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
13910 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
13920 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13930 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
13940 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
13950 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
13960 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
13970 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13980 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
13990 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
139a0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
139b0 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
139c0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
139d0 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
139e0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
139f0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
13a00 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
13a10 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
13a20 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
13a30 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
13a40 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
13a50 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
13a60 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
13a70 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
13a80 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
13a90 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
13aa0 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
13ab0 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
13ac0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
13ad0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
13ae0 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
13af0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
13b00 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
13b10 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
13b20 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
13b30 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
13b40 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
13b50 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
13b60 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
13b70 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
13b80 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
13b90 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
13ba0 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
13bb0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
13bc0 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
13bd0 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
13be0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
13bf0 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69  WRITE) || pBt->i
13c00 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20  sPending ){.    
13c10 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
13c20 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
13c30 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
13c40 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
13c50 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
13c60 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
13c70 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
13c80 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
13c90 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
13ca0 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
13cb0 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
13cc0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
13cd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13ce0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13cf0 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
13d00 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
13d10 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
13d20 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
13d30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
13d40 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
13d50 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
13d60 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
13d70 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
13d80 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
13d90 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
13da0 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
13db0 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
13dc0 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
13dd0 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
13de0 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
13df0 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
13e00 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
13e10 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
13e20 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
13e30 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
13e40 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
13e50 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
13e60 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
13e70 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
13e80 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
13e90 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
13ea0 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  do {.    /* Call
13eb0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74   lockBtree() unt
13ec0 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70  il either pBt->p
13ed0 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74  Page1 is populat
13ee0 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63  ed or.    ** loc
13ef0 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73  kBtree() returns
13f00 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
13f10 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
13f20 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20   lockBtree().   
13f30 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
13f40 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
13f50 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73  ve pBt->pPage1 s
13f60 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72  et to 0 if after
13f70 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
13f80 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76  page 1 it discov
13f90 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ers that the pag
13fa0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e-size of the da
13fb0 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66  tabase .    ** f
13fc0 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e  ile is not pBt->
13fd0 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69  pageSize. In thi
13fe0 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65  s case lockBtree
13ff0 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20  () will update. 
14000 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53     ** pBt->pageS
14010 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ize to the page-
14020 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
14030 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   on disk..    */
14040 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d  .    while( pBt-
14050 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51  >pPage1==0 && SQ
14060 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c  LITE_OK==(rc = l
14070 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29  ockBtree(pBt)) )
14080 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
14090 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
140a0 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
140b0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
140c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
140d0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
140e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
140f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14100 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
14110 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
14120 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
14130 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
14140 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14150 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14160 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
14170 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
14180 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14190 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
141a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
141b0 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
141c0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
141d0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
141e0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
141f0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
14200 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
14210 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
14220 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
14230 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
14240 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14250 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
14260 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
14270 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
14280 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
14290 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
142a0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
142b0 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
142c0 73 68 61 72 61 62 6c 65 20 29 7b 0a 09 61 73 73  sharable ){..ass
142d0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
142e0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
142f0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
14300 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
14310 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
14320 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
14330 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
14340 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
14350 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
14360 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
14370 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
14380 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
14390 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
143a0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
143b0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
143c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
143d0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
143e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
143f0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
14400 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
14410 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
14420 48 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61  HE.    if( wrfla
14430 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
14440 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72  t( !pBt->pWriter
14450 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   );.      pBt->p
14460 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20  Writer = p;.    
14470 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69    pBt->isExclusi
14480 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67  ve = (u8)(wrflag
14490 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  >1);.    }.#endi
144a0 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  f.  }...trans_be
144b0 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
144c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
144d0 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
144e0 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
144f0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
14500 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
14510 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
14520 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
14530 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
14540 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
14550 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
14560 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
14570 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
14580 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
14590 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
145a0 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
145b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
145c0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
145d0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
145e0 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
145f0 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
14600 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
14610 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14620 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
14630 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
14640 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14650 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
14660 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
14670 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
14680 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
14690 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
146a0 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
146b0 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
146c0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
146d0 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
146e0 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
146f0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
14700 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
14710 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
14720 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
14730 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
14740 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
14770 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
14780 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
147b0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
147c0 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
147d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
14800 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
14810 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
14820 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
14830 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
14840 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
14850 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
14860 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14870 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
14880 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
14890 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
148a0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
148b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
148c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74   ){.    goto set
148d0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
148e0 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  ut;.  }.  nCell 
148f0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
14900 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
14910 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
14920 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
14930 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
14940 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
14950 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
14960 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66  l, &rc);..    if
14970 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
14980 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
14990 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
149a0 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
149b0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
149c0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
149d0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
149e0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
149f0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
14a00 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
14a10 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
14a20 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
14a30 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
14a40 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  t+8]);.    ptrma
14a50 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
14a60 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
14a70 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
14a80 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
14a90 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
14aa0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
14ab0 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
14ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
14ad0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
14ae0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
14af0 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
14b00 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
14b10 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
14b20 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
14b30 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
14b40 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
14b50 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
14b60 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
14b70 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
14b80 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
14b90 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
14ba0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
14bb0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
14bc0 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
14bf0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
14c00 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
14c10 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
14c20 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
14c30 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
14c40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14c50 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
14c60 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
14c70 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
14c80 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
14c90 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
14ca0 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
14cb0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
14cc0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
14cd0 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
14ce0 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
14cf0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
14d00 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
14d10 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
14d20 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
14d30 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
14d40 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
14d50 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
14d60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
14d70 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
14d80 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
14d90 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
14da0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
14db0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
14dc0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
14dd0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
14de0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
14df0 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
14e00 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
14e10 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
14e20 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
14e30 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
14e40 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
14e50 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
14e60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
14e70 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
14e80 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
14e90 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
14ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69   }else{.    u8 i
14eb0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
14ec0 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
14ed0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
14ee0 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49  ell;..    btreeI
14ef0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
14f00 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
14f10 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
14f20 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
14f30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
14f40 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
14f50 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
14f60 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
14f70 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
14f80 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
14f90 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
14fa0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
14fb0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
14fc0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
14fd0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
14fe0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
14ff0 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
15000 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
15010 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
15020 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
15030 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
15040 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
15050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
15060 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
15070 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
15080 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15090 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
150a0 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
150b0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
150c0 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
150d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
150e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
150f0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
15100 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
15110 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
15120 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
15130 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
15140 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
15150 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
15160 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
15170 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15180 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
15190 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
151a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
151b0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
151c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
151d0 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
151e0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
151f0 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
15200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15210 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
15220 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
15230 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
15240 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
15250 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
15260 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
15270 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
15280 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
15290 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
152a0 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
152b0 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
152c0 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
152d0 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
152e0 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
152f0 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
15300 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
15310 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
15320 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
15330 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
15340 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
15350 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
15360 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
15370 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
15380 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
15390 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
153a0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
153b0 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
153c0 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
153d0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
153e0 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
153f0 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
15400 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
15410 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
15420 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
15430 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
15440 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
15450 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
15460 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
15470 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
15480 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
15490 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
154a0 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
154b0 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
154c0 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
154d0 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
154e0 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
154f0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
15500 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
15510 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
15520 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
15530 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
15540 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
15550 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
15560 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
15570 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
15580 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
15590 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
155a0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
155b0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
155c0 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
155d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
155e0 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
155f0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
15600 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
15610 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
15620 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15630 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
15640 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
15650 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
15660 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
15670 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
15680 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
15690 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
156a0 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
156b0 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
156c0 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
156d0 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
156e0 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
156f0 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
15700 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
15710 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
15720 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
15730 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
15740 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
15750 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
15760 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
15770 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
15780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15790 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
157a0 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
157b0 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
157c0 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
157d0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
157e0 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
157f0 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
15800 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
15810 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
15820 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
15830 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
15840 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
15850 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
15860 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
15870 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
15880 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
15890 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
158a0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
158b0 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
158c0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
158d0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
158e0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
158f0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
15900 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
15910 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
15920 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
15930 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
15940 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
15950 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
15960 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
15970 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
15980 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
15990 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
159a0 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
159b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
159c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
159d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
159e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
159f0 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
15a00 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
15a10 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
15a20 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
15a30 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
15a40 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
15a50 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
15a60 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  reePage, &rc);. 
15a70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15a80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15a90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15aa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15ab0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
15ac0 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
15ad0 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
15ae0 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
15af0 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
15b00 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
15b10 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
15b20 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
15b30 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
15b40 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
15b50 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
15b60 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
15b70 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
15b80 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
15b90 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
15ba0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
15bb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15bc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15bd0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
15be0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
15bf0 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
15c00 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
15c10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15c20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
15c30 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
15c40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15c50 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
15c60 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
15c70 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
15c80 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
15c90 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
15ca0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
15cb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15cc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74  E_OK ){.      pt
15cd0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
15ce0 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
15cf0 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  PtrPage, &rc);. 
15d00 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15d10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
15d20 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
15d30 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
15d40 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
15d50 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
15d60 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
15d70 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
15d80 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
15d90 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
15da0 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
15db0 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
15dc0 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
15dd0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
15de0 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
15df0 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
15e00 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
15e10 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a  nd therefore no.
15e20 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c  ** point in call
15e30 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
15e40 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
15e50 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
15e60 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
15e70 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  cly, this functi
15e80 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
15e90 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a  e-organize the .
15ea0 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74  ** database so t
15eb0 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
15ec0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
15ed0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a  rrently in use.*
15ee0 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  * is no longer i
15ef0 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n use..**.** If 
15f00 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74  the nFin paramet
15f10 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
15f20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
15f30 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  sumes.** that th
15f40 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  e caller will ke
15f50 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
15f60 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
15f70 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20  l.** it returns 
15f80 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
15f90 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61  n error, and tha
15fa0 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a  t nFin is the.**
15fb0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
15fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15fd0 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  le will contain 
15fe0 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70  after this .** p
15ff0 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65  rocess is comple
16000 74 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20  te.  If nFin is 
16010 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75  zero, it is assu
16020 6d 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72  med that.** incr
16030 56 61 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c  VacuumStep() wil
16040 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69  l be called a fi
16050 6e 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74  nite amount of t
16060 69 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61  imes.** which ma
16070 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70  y or may not emp
16080 74 79 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ty the freelist.
16090 20 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63    A full autovac
160a0 75 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e  uum.** has nFin>
160b0 30 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e  0.  A "PRAGMA in
160c0 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d  cremental_vacuum
160d0 22 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a  " has nFin==0..*
160e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
160f0 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
16100 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
16110 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
16120 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  Pg){.  Pgno nFre
16130 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
16140 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
16150 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
16160 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
16170 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16180 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
16190 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
161a0 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
161b0 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
161c0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
161d0 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
161e0 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
161f0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
16200 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75     int rc;.    u
16210 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
16220 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
16230 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
16240 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
16250 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
16260 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
16270 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
16280 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
16290 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
162a0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
162b0 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
162c0 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
162d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
162e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
162f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16300 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
16310 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
16320 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16330 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
16350 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
16360 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
16370 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
16380 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
16390 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
163a0 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
163b0 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
163c0 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
163d0 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20    ** if nFin is 
163e0 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
163f0 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
16400 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
16410 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
16420 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
16430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
16440 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
16450 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
16460 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
16470 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
16480 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
16490 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
164a0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
164b0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
164c0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
164d0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
164e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
164f0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
16500 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
16510 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16520 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16530 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16540 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
16550 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16560 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
16570 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
16580 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
16590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
165a0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
165b0 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
165c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
165d0 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
165e0 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
165f0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
16600 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20   *pLastPg;..    
16610 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
16620 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
16630 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
16640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16660 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16670 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
16680 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c  If nFin is zero,
16690 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
166a0 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
166b0 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
166c0 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
166d0 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
166e0 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
166f0 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
16700 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
16710 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
16720 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69  her hand, if nFi
16730 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  n is greater tha
16740 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
16750 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
16760 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
16770 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
16780 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
16790 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
167a0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
167b0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
167c0 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
167d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
167e0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
167f0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
16800 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
16810 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c  Pg, &iFreePg, 0,
16820 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
16830 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16840 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
16850 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
16860 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
16870 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
16880 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
16890 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
168a0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69       }while( nFi
168b0 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e  n!=0 && iFreePg>
168c0 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
168d0 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
168e0 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
168f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16900 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61  e3PagerWrite(pLa
16910 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  stPg->pDbPage);.
16920 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16930 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16940 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
16950 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
16960 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
16970 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69  ge, iFreePg, nFi
16980 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n!=0);.      }. 
16990 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
169a0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
169b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
169c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
169d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
169e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
169f0 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
16a00 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
16a10 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
16a20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
16a30 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49  E(pBt)||PTRMAP_I
16a40 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
16a50 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Pg) ){.      if(
16a60 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
16a70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a  Bt, iLastPg) ){.
16a80 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
16a90 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 69 6e  *pPg;.        in
16aa0 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  t rc = btreeGetP
16ab0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
16ac0 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
16ad0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16ae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16af0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16b10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
16b20 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
16b30 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
16b40 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
16b50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16b60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16b70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
16b80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16b90 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50    }.      iLastP
16ba0 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g--;.    }.    s
16bb0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
16bc0 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
16bd0 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a  ager, iLastPg);.
16be0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
16bf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16c00 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
16c10 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
16c20 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
16c30 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
16c40 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
16c50 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
16c60 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
16c70 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
16c80 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
16c90 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
16ca0 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
16cb0 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
16cc0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
16cd0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
16ce0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
16cf0 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
16d00 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
16d10 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
16d20 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
16d30 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
16d40 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
16d50 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
16d60 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
16d70 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
16d80 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
16d90 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16da0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
16db0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
16dc0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
16dd0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
16de0 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
16df0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
16e00 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
16e10 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
16e20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
16e30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16e40 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
16e50 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
16e60 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
16e70 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20  uumStep(pBt, 0, 
16e80 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
16e90 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Bt));.  }.  sqli
16ea0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16eb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16ec0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
16ed0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
16ee0 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
16ef0 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
16f00 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
16f10 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72   is commited for
16f20 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
16f30 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
16f40 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
16f50 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
16f60 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
16f70 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
16f80 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
16f90 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
16fa0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
16fb0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
16fc0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
16fd0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
16fe0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
16ff0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
17000 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
17010 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
17020 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
17030 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
17040 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
17050 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
17060 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17070 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
17080 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
17090 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
170a0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
170b0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
170c0 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  ger) );..  asser
170d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
170e0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
170f0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
17100 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
17110 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
17120 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
17130 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
17140 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
17150 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
17160 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17170 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
17180 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
17190 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
171a0 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
171b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
171c0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
171d0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
171e0 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  .    Pgno nPtrma
171f0 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  p;      /* Numbe
17200 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
17210 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
17220 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
17230 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
17240 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
17250 72 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  reed */.    int 
17260 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f  nEntry;        /
17270 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
17280 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
17290 70 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  p page */.    Pg
172a0 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
172b0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
172c0 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
172d0 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
172e0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
172f0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
17300 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
17310 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
17320 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
17330 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
17340 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
17350 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
17360 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
17370 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
17380 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
17390 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
173a0 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
173b0 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
173c0 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
173d0 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
173e0 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
173f0 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
17400 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17410 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17420 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
17430 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
17440 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
17450 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
17460 3b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70  ;.    nEntry = p
17470 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
17480 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20  ;.    nPtrmap = 
17490 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
174a0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
174b0 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
174c0 45 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20  Entry;.    nFin 
174d0 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
174e0 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69  - nPtrmap;.    i
174f0 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
17500 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
17510 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
17520 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
17530 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
17540 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
17550 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
17560 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
17570 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
17580 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
17590 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
175a0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
175b0 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
175c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
175d0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65  ;..    for(iFree
175e0 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
175f0 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
17600 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
17610 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
17620 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
17630 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20  in, iFree);.    
17640 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
17650 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
17660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
17670 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
17680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17690 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
176a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
176b0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
176c0 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
176d0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
176e0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
176f0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
17700 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
17710 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
17720 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
17730 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
17740 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b  ->pPager, nFin);
17750 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
17760 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17770 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
17780 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
17790 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
177a0 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
177b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
177c0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
177d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
177e0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
177f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17800 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
17810 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
17820 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
17830 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
17840 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
17850 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
17860 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
17870 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
17880 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
17890 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
178a0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
178b0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
178c0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
178d0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
178e0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
178f0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
17900 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
17910 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
17920 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
17930 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
17940 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
17950 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
17960 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
17970 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
17980 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
17990 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
179a0 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
179b0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
179c0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
179d0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
179e0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
179f0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
17a00 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17a10 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
17a20 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
17a30 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
17a40 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
17a50 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
17a60 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
17a70 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
17a80 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
17a90 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
17aa0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17ab0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
17ac0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
17ad0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
17ae0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
17af0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
17b00 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
17b10 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
17b20 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
17b30 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
17b40 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
17b50 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
17b60 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
17b70 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
17b80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
17b90 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
17ba0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
17bb0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
17bc0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
17bd0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
17be0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
17bf0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
17c00 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
17c10 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
17c20 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
17c30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17c40 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
17c50 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
17c60 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
17c70 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
17c80 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
17c90 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
17ca0 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
17cb0 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
17cc0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
17cd0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
17ce0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
17cf0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
17d00 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
17d10 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
17d20 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
17d30 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
17d40 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
17d50 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
17d60 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
17d70 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
17d80 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
17d90 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
17da0 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
17db0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
17dc0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
17dd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17de0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
17df0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
17e00 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
17e10 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
17e20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17e30 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
17e40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
17e50 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
17e60 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
17e70 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
17e80 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
17e90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17eb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17ec0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
17ed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
17ef0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
17f00 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
17f10 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
17f20 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
17f30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17f40 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
17f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17f60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17f70 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
17f80 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
17f90 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
17fa0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
17fb0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
17fc0 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
17fd0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
17fe0 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
17ff0 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
18000 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
18010 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
18020 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18030 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
18040 70 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c  p) );..  btreeCl
18050 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
18060 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  t);.  if( p->inT
18070 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
18080 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65  && p->db->active
18090 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20  VdbeCnt>1 ){.   
180a0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
180b0 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
180c0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
180d0 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
180e0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
180f0 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
18100 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
18110 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
18120 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
18130 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
18140 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
18150 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
18160 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
18170 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
18180 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
18190 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
181a0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
181b0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
181c0 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
181d0 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
181e0 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
181f0 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
18200 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
18210 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
18220 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
18230 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
18240 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
18250 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
18260 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
18270 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
18280 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
18290 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
182a0 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
182b0 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
182c0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
182d0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
182e0 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
182f0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
18300 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
18310 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
18320 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
18330 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
18340 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
18350 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
18360 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
18370 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
18380 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
18390 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
183a0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
183b0 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
183c0 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
183d0 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
183e0 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
183f0 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
18400 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
18410 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
18420 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
18430 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
18440 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
18450 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
18460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
18470 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
18480 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
18490 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
184a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
184b0 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
184c0 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
184d0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
184e0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
184f0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
18500 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
18510 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
18520 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
18530 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
18540 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
18550 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
18560 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
18570 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
18580 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
18590 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
185a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
185b0 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
185c0 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
185d0 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
185e0 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
185f0 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
18600 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
18610 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
18620 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
18630 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
18640 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
18650 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
18660 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
18670 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
18680 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
18690 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
186a0 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   locks..**.** Th
186b0 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
186c0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
186d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
186e0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
186f0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
18700 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
18710 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
18720 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
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 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
18750 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
18760 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18770 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
18780 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
18790 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
187a0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
187b0 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
187c0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
187d0 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
187e0 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
187f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
18800 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
18810 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
18820 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
18830 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
18840 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
18850 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
18860 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18870 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
18880 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18890 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
188a0 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
188b0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
188c0 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
188d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
188e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
188f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
18900 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18910 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18920 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
18930 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
18940 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
18950 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
18960 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
18970 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18980 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18990 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
189a0 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
189b0 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
189c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
189d0 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
189e0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
189f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18a00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
18a10 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
18a20 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
18a30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18a40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18a50 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
18a60 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73  eTwo(p);.  }.  s
18a70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18a80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
18a90 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
18aa0 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
18ab0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
18ac0 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
18ad0 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
18ae0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
18af0 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
18b00 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
18b10 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
18b20 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
18b30 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
18b40 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
18b50 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
18b60 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
18b70 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
18b80 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
18b90 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
18ba0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
18bb0 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
18bc0 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
18bd0 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
18be0 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
18bf0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
18c00 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
18c10 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
18c20 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
18c30 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
18c40 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
18c50 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
18c60 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
18c70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
18c80 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
18c90 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
18ca0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
18cb0 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
18cc0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
18cd0 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
18ce0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
18cf0 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
18d00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
18d10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
18d20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
18d30 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
18d40 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
18d50 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
18d60 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
18d70 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
18d80 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
18d90 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
18da0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
18db0 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
18dc0 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
18dd0 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
18de0 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
18df0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18e00 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
18e10 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
18e20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
18e30 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
18e40 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
18e50 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
18e60 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
18e70 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
18e80 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
18e90 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
18ea0 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
18eb0 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
18ec0 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
18ed0 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
18ee0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
18ef0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
18f00 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
18f10 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
18f20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
18f30 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
18f40 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
18f50 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
18f60 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
18f70 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
18f80 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
18f90 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
18fa0 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
18fb0 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
18fc0 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
18fd0 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
18fe0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
18ff0 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
19000 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
19010 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
19020 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
19030 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
19040 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
19050 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
19060 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
19070 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
19080 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
19090 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
190a0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
190b0 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
190c0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
190d0 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
190e0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
190f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
19100 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
19110 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
19120 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
19130 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
19140 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
19150 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
19160 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
19170 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
19180 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
19190 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
191a0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
191b0 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
191c0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
191d0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
191e0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
191f0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
19200 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19210 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
19220 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
19230 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
19240 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
19250 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
19260 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
19270 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
19280 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
19290 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
192a0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
192b0 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
192c0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
192d0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
192e0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
192f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19300 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
19310 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
19330 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
19340 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
19350 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
19360 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
19370 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
19380 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
19390 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
193a0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
193b0 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
193c0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
193d0 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
193e0 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
193f0 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
19400 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
19410 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
19420 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
19430 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
19440 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
19450 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
19460 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
19470 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
19480 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
19490 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
194a0 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
194b0 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
194c0 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
194d0 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
194e0 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
194f0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
19500 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
19510 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
19520 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
19530 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
19540 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
19550 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
19560 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
19570 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
19580 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
19590 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
195a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
195b0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
195c0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
195d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
195e0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
195f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
19600 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
19610 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
19620 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
19630 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
19640 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
19650 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
19660 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
19670 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
19680 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
19690 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
196a0 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
196b0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
196c0 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
196d0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
196e0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
196f0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
19700 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
19710 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
19720 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19730 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
19740 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
19750 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
19760 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
19770 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
19780 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
19790 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
197a0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
197b0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
197c0 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72  ion can can be r
197d0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
197e0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
197f0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
19800 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
19810 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
19820 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
19830 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
19840 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
19850 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
19860 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
19870 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
19880 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
19890 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
198a0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
198b0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
198c0 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
198d0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
198e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
198f0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
19900 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
19910 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
19920 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
19930 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
19940 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
19950 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
19960 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
19970 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
19980 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
19990 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
199a0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
199b0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
199c0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
199d0 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
199e0 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
199f0 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
19a00 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
19a10 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
19a20 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
19a30 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
19a40 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
19a50 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
19a60 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
19a70 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
19a80 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
19a90 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
19aa0 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
19ab0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
19ac0 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
19ad0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
19ae0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
19af0 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
19b00 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
19b10 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
19b20 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
19b30 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
19b40 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
19b50 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
19b60 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
19b70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19b80 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
19b90 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
19ba0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
19bb0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19bc0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
19bd0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19be0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
19bf0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
19c00 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
19c10 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  pBt->readOnly==0
19c20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
19c30 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
19c40 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
19c50 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
19c60 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45  oint );.  if( NE
19c70 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  VER(p->inTrans!=
19c80 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70  TRANS_WRITE || p
19c90 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  Bt->readOnly) ){
19ca0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19cb0 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c  _INTERNAL;.  }el
19cc0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
19cd0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
19ce0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
19cf0 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65  );.    /* At the
19d00 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
19d10 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
19d20 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
19d30 6f 69 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a  oint with.    **
19d40 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
19d50 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
19d60 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
19d70 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
19d80 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d     ** SQL statem
19d90 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
19da0 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
19db0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
19dc0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68   any.    ** such
19dd0 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
19de0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
19df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
19e00 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
19e10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
19e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
19e30 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
19e40 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
19e50 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
19e60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19e80 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
19e90 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
19ea0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c  is function, op,
19eb0 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50   is always SAVEP
19ec0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a  OINT_ROLLBACK.**
19ed0 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
19ee0 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63  LEASE. This func
19ef0 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65  tion either rele
19f00 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  ases or rolls ba
19f10 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f  ck the.** savepo
19f20 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  int identified b
19f30 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76  y parameter iSav
19f40 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e  epoint, dependin
19f50 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a  g on the value .
19f60 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ** of op..**.** 
19f70 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70  Normally, iSavep
19f80 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
19f90 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
19fa0 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20   zero. However, 
19fb0 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45  if op is.** SAVE
19fc0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
19fd0 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  then iSavepoint 
19fe0 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20  may also be -1. 
19ff0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
1a000 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
1a010 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
1a020 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c  saction are roll
1a030 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
1a040 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
1a050 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e  om a normal tran
1a060 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
1a070 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  , as no locks ar
1a080 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74  e released and t
1a090 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
1a0a0 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a  n remains open..
1a0b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a0c0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72  reeSavepoint(Btr
1a0d0 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  ee *p, int op, i
1a0e0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
1a0f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a100 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26  E_OK;.  if( p &&
1a110 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1a120 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1a130 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a140 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1a150 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
1a160 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
1a170 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
1a180 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
1a190 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
1a1a0 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
1a1b0 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
1a1c0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
1a1d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1a1e0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
1a1f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a200 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
1a210 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
1a220 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
1a230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a240 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  {.      rc = new
1a250 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1a260 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1a270 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1a280 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a290 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1a2a0 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1a2b0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1a2c0 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1a2d0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1a2e0 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1a2f0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1a300 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1a310 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1a320 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1a330 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1a340 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1a350 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1a360 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1a370 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1a380 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1a390 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1a3a0 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1a3b0 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1a3c0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1a3d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1a3e0 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1a3f0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1a400 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1a410 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1a420 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1a430 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1a440 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1a450 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1a460 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1a470 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1a480 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1a490 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1a4a0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1a4b0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1a4c0 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1a4d0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1a4e0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1a4f0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1a500 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1a510 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1a520 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1a530 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a540 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1a550 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1a560 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1a570 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1a580 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1a590 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1a5a0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1a5b0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1a5c0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1a5d0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1a5e0 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1a5f0 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1a600 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1a610 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1a620 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1a630 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1a640 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1a650 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1a660 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1a670 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1a680 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1a690 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
1a6a0 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
1a6b0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
1a6c0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
1a6d0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
1a6e0 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
1a6f0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
1a700 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
1a710 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
1a720 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
1a730 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1a740 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1a750 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
1a760 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
1a770 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
1a780 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1a790 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1a7a0 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74  CursorSize() byt
1a7b0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a  es of memory .**
1a7c0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
1a7d0 43 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65  Cur have been ze
1a7e0 72 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  roed by the call
1a7f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a800 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1a810 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a830 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1a840 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1a850 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a870 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1a880 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1a890 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1a8c0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1a8d0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1a8e0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1a8f0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1a900 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1a910 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1a920 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1a930 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a950 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1a960 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1a970 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a980 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1a990 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1a9a0 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1a9b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1a9c0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1a9d0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1a9e0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1a9f0 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1aa00 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1aa10 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
1aa20 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
1aa30 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
1aa40 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
1aa50 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
1aa60 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
1aa70 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
1aa80 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
1aa90 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
1aaa0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
1aab0 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
1aac0 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
1aad0 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
1aae0 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
1aaf0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
1ab00 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1ab10 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1ab20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
1ab30 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
1ab40 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1ab50 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1ab60 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
1ab70 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1ab80 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1ab90 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
1aba0 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
1abb0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1abc0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1abd0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
1abe0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1abf0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1ac00 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1ac10 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
1ac20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
1ac30 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
1ac40 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
1ac50 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
1ac60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ac70 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1ac80 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
1ac90 3d 31 20 26 26 20 70 61 67 65 72 50 61 67 65 63  =1 && pagerPagec
1aca0 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
1acb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1acc0 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20  E_EMPTY;.  }..  
1acd0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
1ace0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
1acf0 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
1ad00 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
1ad10 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
1ad20 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
1ad30 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
1ad40 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
1ad50 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
1ad60 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
1ad70 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
1ad80 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
1ad90 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1ada0 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
1adb0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
1adc0 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
1add0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28  pCur->wrFlag = (
1ade0 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75  u8)wrFlag;.  pCu
1adf0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
1ae00 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1ae10 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1ae20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1ae30 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
1ae40 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
1ae50 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
1ae60 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1ae70 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d  INVALID;.  pCur-
1ae80 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30  >cachedRowid = 0
1ae90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1aea0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1aeb0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
1aec0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aef0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1af00 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1af30 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
1af40 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1af50 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1af80 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1af90 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1afa0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1afb0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1afc0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1afd0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
1afe0 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
1aff0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b010 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
1b020 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
1b030 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1b040 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1b050 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
1b060 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
1b070 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
1b080 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
1b090 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b0a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b0b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b0c0 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
1b0d0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
1b0e0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
1b0f0 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
1b100 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
1b110 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
1b120 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
1b130 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
1b140 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
1b150 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
1b160 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
1b170 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
1b180 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
1b190 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
1b1a0 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
1b1b0 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
1b1c0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1b1d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b1e0 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
1b1f0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
1b200 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
1b210 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
1b220 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20   Set the cached 
1b230 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65  rowid value of e
1b240 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74  very cursor in t
1b250 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
1b260 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72   file.** as pCur
1b270 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20   and having the 
1b280 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
1b290 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20  umber as pCur.  
1b2a0 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  The value is.** 
1b2b0 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a  set to iRowid..*
1b2c0 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69  *.** Only positi
1b2d0 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20  ve rowid values 
1b2e0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76  are considered v
1b2f0 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61  alid for this ca
1b300 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68  che..** The cach
1b310 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
1b320 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61   to zero, indica
1b330 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20  ting an invalid 
1b340 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65  cache..** A btre
1b350 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  e will work fine
1b360 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65   with zero or ne
1b370 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20  gative rowids.  
1b380 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a  We just cannot.*
1b390 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20  * cache zero or 
1b3a0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c  negative rowids,
1b3b0 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62   which means tab
1b3c0 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72  les that use zer
1b3d0 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65  o or.** negative
1b3e0 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75   rowids might ru
1b3f0 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
1b400 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74  r.  But in pract
1b410 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ice, zero.** or 
1b420 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1b430 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f  are very uncommo
1b440 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64  n so this should
1b450 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
1b460 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
1b470 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
1b480 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
1b490 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pCur, sqlite3_in
1b4a0 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42  t64 iRowid){.  B
1b4b0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
1b4c0 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70  r(p=pCur->pBt->p
1b4d0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1b4e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1b4f0 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75  p->pgnoRoot==pCu
1b500 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d  r->pgnoRoot ) p-
1b510 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69  >cachedRowid = i
1b520 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Rowid;.  }.  ass
1b530 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65  ert( pCur->cache
1b540 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29  dRowid==iRowid )
1b550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b560 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  n the cached row
1b570 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
1b580 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61   cursor.  A nega
1b590 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  tive or zero.** 
1b5a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
1b5b0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1b5c0 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69  rowid cache is i
1b5d0 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
1b5e0 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  d be.** ignored.
1b5f0 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63    If the rowid c
1b600 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62  ache has never b
1b610 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20  efore been set, 
1b620 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69  then a.** zero i
1b630 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1b640 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
1b650 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
1b660 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
1b670 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
1b680 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  n pCur->cachedRo
1b690 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  wid;.}../*.** Cl
1b6a0 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
1b6b0 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
1b6c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b6d0 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
1b6e0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
1b6f0 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
1b700 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b710 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
1b720 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1b730 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1b740 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
1b750 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
1b760 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1b770 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b780 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
1b790 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b7a0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
1b7b0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
1b7c0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
1b7d0 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
1b7e0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1b7f0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
1b800 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1b810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
1b820 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1b830 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1b840 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
1b850 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
1b860 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1b870 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
1b880 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
1b890 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1b8a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1b8b0 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1b8c0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
1b8d0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1b8e0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1b8f0 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
1b900 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
1b910 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
1b920 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
1b930 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b940 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1b950 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1b960 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b970 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
1b980 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
1b990 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
1b9a0 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
1b9b0 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
1b9c0 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
1b9d0 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
1b9e0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
1b9f0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
1ba00 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
1ba10 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
1ba20 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
1ba30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
1ba40 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
1ba50 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
1ba60 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
1ba70 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
1ba80 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
1ba90 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
1baa0 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
1bab0 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
1bac0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
1bad0 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
1bae0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
1baf0 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
1bb00 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
1bb10 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
1bb20 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
1bb30 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
1bb40 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
1bb50 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
1bb60 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
1bb70 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
1bb80 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1bb90 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
1bba0 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
1bbb0 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
1bbc0 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
1bbd0 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
1bbe0 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
1bbf0 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
1bc00 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
1bc10 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
1bc20 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
1bc30 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
1bc40 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
1bc50 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
1bc60 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1bc70 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
1bc80 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
1bc90 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1bca0 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
1bcb0 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
1bcc0 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
1bcd0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1bce0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1bcf0 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
1bd00 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
1bd10 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
1bd20 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
1bd30 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
1bd40 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
1bd50 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
1bd60 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
1bd70 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
1bd80 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
1bd90 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
1bda0 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
1bdb0 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
1bdc0 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
1bdd0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
1bde0 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
1bdf0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1be00 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1be10 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
1be20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1be30 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
1be40 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1be50 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1be60 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1be70 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1be80 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
1be90 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
1bea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1beb0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1bec0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1bed0 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
1bee0 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
1bef0 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
1bf00 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
1bf10 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
1bf20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
1bf30 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
1bf40 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
1bf90 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1bfa0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfd0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1bfe0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1bff0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c020 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
1c030 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1c040 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1c050 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1c060 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1c070 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61  ; \.    pCur->va
1c080 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20  lidNKey = 1;    
1c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
1c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
1c120 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
1c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c160 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
1c170 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
1c180 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1c190 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
1c1a0 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
1c1b0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1c1c0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
1c1d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1c1e0 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
1c1f0 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
1c200 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
1c210 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
1c220 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1c230 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
1c240 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
1c250 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
1c260 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
1c270 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1c280 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1c290 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
1c2a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1c2b0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1c2c0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1c2d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1c2e0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1c2f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
1c300 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
1c310 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
1c320 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
1c330 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
1c340 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
1c350 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
1c360 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
1c370 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
1c380 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1c390 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
1c3a0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
1c3b0 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
1c3c0 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
1c3d0 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
1c3e0 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
1c3f0 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
1c400 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
1c410 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
1c420 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1c430 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
1c440 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1c450 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
1c460 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
1c470 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1c480 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
1c490 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1c4a0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
1c4b0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1c4c0 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
1c4d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1c4e0 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
1c4f0 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
1c500 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1c510 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1c520 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1c530 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1c540 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
1c550 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
1c560 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1c570 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1c580 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
1c590 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   ){.    *pSize =
1c5a0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1c5b0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1c5c0 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  r);.    *pSize =
1c5d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1c5e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1c5f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1c600 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1c610 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1c620 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
1c630 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
1c640 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
1c650 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
1c660 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1c670 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
1c680 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
1c690 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
1c6a0 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
1c6b0 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
1c6c0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
1c6d0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
1c6e0 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
1c6f0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1c700 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
1c710 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
1c720 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
1c730 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
1c740 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1c750 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1c760 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
1c770 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
1c780 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
1c790 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
1c7a0 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
1c7b0 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
1c7c0 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
1c7d0 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
1c7e0 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
1c7f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c800 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
1c810 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
1c820 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1c830 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c840 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1c850 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1c860 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1c870 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
1c880 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
1c890 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
1c8a0 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ata;.  return SQ
1c8b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c8c0 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
1c8d0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
1c8e0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1c8f0 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
1c900 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
1c910 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1c920 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
1c930 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1c940 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
1c950 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1c960 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1c970 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
1c980 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
1c990 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
1c9a0 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
1c9b0 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
1c9c0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1c9d0 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
1c9e0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1c9f0 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
1ca00 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1ca10 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1ca20 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
1ca30 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1ca40 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
1ca50 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
1ca60 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
1ca70 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
1ca80 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
1ca90 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
1caa0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
1cab0 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
1cac0 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
1cad0 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
1cae0 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
1caf0 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
1cb00 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
1cb10 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
1cb20 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
1cb30 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
1cb40 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
1cb50 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
1cb60 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1cb70 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
1cb80 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
1cb90 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1cba0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
1cbb0 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
1cbc0 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
1cbd0 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
1cbe0 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
1cbf0 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
1cc00 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
1cc10 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
1cc20 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
1cc30 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
1cc40 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
1cc50 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
1cc60 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
1cc70 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
1cc80 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
1cc90 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1cca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ccb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1ccc0 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cce0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
1ccf0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1cd00 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
1cd10 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
1cd20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
1cd30 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
1cd40 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
1cd50 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
1cd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1cd70 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
1cd80 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
1cd90 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
1cda0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1cdb0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
1cdc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1cdd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1cde0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1cdf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1ce00 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
1ce10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ce20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1ce30 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
1ce40 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
1ce50 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1ce60 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
1ce70 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
1ce80 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
1ce90 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
1cea0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
1ceb0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
1cec0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
1ced0 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
1cee0 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
1cef0 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
1cf00 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
1cf10 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
1cf20 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
1cf30 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
1cf40 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
1cf50 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
1cf60 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
1cf70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1cf80 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1cf90 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
1cfa0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
1cfb0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
1cfc0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1cfd0 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
1cfe0 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
1cff0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1d000 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
1d010 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
1d020 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67   if( iGuess<=pag
1d030 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
1d040 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1d050 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
1d060 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
1d070 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1d080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d090 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1d0a0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
1d0b0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
1d0c0 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
1d0d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1d0e0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1d0f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1d100 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
1d110 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
1d120 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
1d130 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d140 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1d150 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
1d160 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b  vfl, &pPage, 0);
1d170 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
1d180 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
1d190 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
1d1a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d1b0 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
1d1c0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1d1d0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
1d1e0 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
1d1f0 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
1d200 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
1d210 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
1d220 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
1d230 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
1d240 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
1d250 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
1d260 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
1d270 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
1d280 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1d290 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
1d2a0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
1d2b0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
1d2c0 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
1d2d0 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
1d2e0 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
1d2f0 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
1d300 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
1d310 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
1d320 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
1d330 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
1d340 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
1d350 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
1d360 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
1d370 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
1d380 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
1d390 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
1d3a0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
1d3b0 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
1d3c0 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
1d3d0 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
1d3e0 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
1d3f0 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
1d400 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d410 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
1d420 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
1d430 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
1d440 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
1d450 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
1d460 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
1d470 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
1d480 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
1d490 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1d4a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1d4b0 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
1d4c0 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
1d4d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d4e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1d4f0 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
1d500 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
1d510 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
1d520 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
1d530 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
1d540 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
1d550 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
1d560 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
1d570 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
1d580 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
1d590 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1d5a0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
1d5b0 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
1d5c0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
1d5d0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
1d5e0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
1d5f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d620 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
1d630 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
1d640 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
1d650 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1d660 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
1d670 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
1d680 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
1d690 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
1d6a0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
1d6b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d6c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1d6d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1d6e0 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
1d6f0 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
1d700 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1d710 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
1d720 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
1d730 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1d740 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
1d750 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
1d760 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
1d770 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
1d780 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
1d790 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
1d7a0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
1d7b0 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
1d7c0 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
1d7d0 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
1d7e0 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
1d7f0 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
1d800 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
1d810 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
1d820 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
1d830 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
1d840 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
1d850 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
1d860 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
1d870 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
1d880 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1d890 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
1d8a0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
1d8b0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
1d8c0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
1d8d0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73   the BtCursor.is
1d8e0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1d8f0 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
1d900 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
1d910 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
1d920 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
1d930 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69  rflow pages, thi
1d940 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
1d950 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f  locates space fo
1d960 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
1d970 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  luates the overf
1d980 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a  low page-list .*
1d990 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  * cache array (B
1d9a0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1d9b0 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63  w). Subsequent c
1d9c0 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a  alls use this.**
1d9d0 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
1d9e0 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
1d9f0 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f  pplied offset mo
1da00 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
1da10 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
1da20 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1da30 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1da40 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
1da50 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
1da60 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
1da70 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
1da80 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
1da90 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
1daa0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
1dab0 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
1dac0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
1dad0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
1dae0 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
1daf0 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
1db00 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
1db10 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1db20 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
1db30 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
1db40 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
1db50 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
1db60 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
1db70 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
1db80 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
1db90 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
1dba0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
1dbb0 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
1dbc0 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
1dbd0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1dbe0 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
1dbf0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
1dc00 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
1dc10 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
1dc20 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
1dc30 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
1dc40 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
1dc50 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc70 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
1dc80 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
1dc90 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
1dca0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
1dcb0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
1dcc0 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dce0 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
1dcf0 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
1dd00 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
1dd10 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1dd20 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1dd30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
1dd40 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
1dd50 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1dd60 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1dd70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1dd80 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
1dd90 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
1dda0 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
1ddb0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1ddc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ddd0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
1dde0 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
1ddf0 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
1de00 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
1de10 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1de20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1de30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1de40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1de50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1de60 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
1de70 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1de80 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
1de90 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1dea0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1deb0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
1dec0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
1ded0 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
1dee0 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
1def0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
1df00 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e  .nKey);..  if( N
1df10 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20  EVER(offset+amt 
1df20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
1df30 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20  o.nData) .   || 
1df40 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
1df50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
1df60 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
1df70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
1df80 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
1df90 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1dfa0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
1dfb0 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
1dfc0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
1dfd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1dfe0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1dff0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
1e000 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
1e010 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
1e020 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
1e030 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
1e040 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
1e050 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
1e060 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1e070 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
1e080 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
1e090 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
1e0a0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
1e0b0 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
1e0c0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
1e0d0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
1e0e0 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
1e0f0 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
1e100 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
1e110 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
1e120 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
1e130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1e140 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
1e150 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
1e160 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e170 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1e180 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
1e190 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
1e1a0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
1e1b0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
1e1c0 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
1e1d0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
1e1e0 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
1e1f0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
1e200 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
1e210 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
1e220 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e230 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
1e240 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
1e250 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
1e260 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
1e270 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1e280 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
1e290 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1e2a0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
1e2b0 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
1e2c0 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
1e2d0 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
1e2e0 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
1e2f0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1e300 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
1e310 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
1e320 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
1e330 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
1e340 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
1e350 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
1e360 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
1e370 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
1e380 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
1e390 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
1e3a0 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
1e3b0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
1e3c0 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
1e3d0 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
1e3e0 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
1e3f0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1e400 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
1e410 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
1e420 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
1e430 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
1e440 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
1e450 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
1e460 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
1e470 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1e480 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
1e490 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a  nOvfl);.      /*
1e4a0 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73   nOvfl is always
1e4b0 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69   positive.  If i
1e4c0 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74  t were zero, fet
1e4d0 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20  chPayload would 
1e4e0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  have.      ** be
1e4f0 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  en used instead 
1e500 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  of this routine.
1e510 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
1e520 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21  WAYS(nOvfl) && !
1e530 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1e540 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e550 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1e560 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1e570 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
1e580 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1e590 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1e5a0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
1e5b0 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
1e5c0 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
1e5d0 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
1e5e0 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
1e5f0 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
1e600 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
1e610 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1e620 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
1e630 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
1e640 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
1e650 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
1e660 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
1e670 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
1e680 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1e690 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
1e6a0 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
1e6b0 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
1e6c0 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
1e6d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e6e0 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
1e6f0 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
1e700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e710 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
1e720 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
1e730 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
1e740 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1e750 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
1e760 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
1e770 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
1e780 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
1e790 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
1e7a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e7b0 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
1e7c0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
1e7d0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1e7e0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
1e7f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1e800 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
1e810 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
1e820 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
1e830 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
1e840 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
1e850 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
1e860 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
1e870 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
1e880 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1e890 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
1e8a0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
1e8b0 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
1e8c0 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
1e8d0 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
1e8e0 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
1e8f0 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
1e900 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
1e910 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
1e920 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1e930 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
1e940 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
1e950 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1e960 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1e970 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
1e980 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
1e990 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1e9a0 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
1e9b0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
1e9c0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1e9d0 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
1e9e0 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
1e9f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
1ea00 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
1ea10 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
1ea20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
1ea30 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
1ea40 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
1ea50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1ea60 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
1ea70 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
1ea80 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
1ea90 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
1eaa0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
1eab0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
1eac0 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
1ead0 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
1eae0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
1eaf0 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
1eb00 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  bPage;.        i
1eb10 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1eb20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1eb30 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
1eb40 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
1eb50 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
1eb60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1eb70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1eb80 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
1eb90 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
1eba0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
1ebb0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1ebc0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
1ebd0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
1ebe0 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
1ebf0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
1ec00 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
1ec10 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
1ec20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ec30 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
1ec40 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
1ec50 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
1ec60 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
1ec70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1ec80 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
1ec90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1eca0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
1ecb0 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
1ecc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66  ;.          pBuf
1ecd0 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d   += a;.        }
1ece0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ecf0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1ed00 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1ed10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1ed20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ed30 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
1ed40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1ed50 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
1ed60 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
1ed70 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
1ed80 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
1ed90 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
1eda0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
1edb0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
1edc0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
1edd0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
1ede0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1edf0 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
1ee00 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
1ee10 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
1ee20 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
1ee30 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1ee40 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1ee50 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
1ee60 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
1ee70 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
1ee80 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1ee90 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
1eea0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
1eeb0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
1eec0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
1eed0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1eee0 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
1eef0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
1ef00 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
1ef10 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
1ef20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1ef30 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1ef40 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1ef50 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1ef60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1ef70 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
1ef80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1ef90 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
1efa0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1efb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
1efc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1efd0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
1efe0 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
1eff0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
1f000 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
1f010 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
1f020 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
1f030 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
1f040 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
1f050 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1f060 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1f070 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1f080 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1f090 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1f0a0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1f0b0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1f0c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1f0d0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1f0e0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1f0f0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1f100 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1f110 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1f120 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1f130 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1f140 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1f150 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1f160 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
1f170 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
1f180 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
1f190 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
1f1a0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
1f1b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f1c0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1f1d0 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
1f1e0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1f1f0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1f200 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
1f210 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1f220 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f230 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f240 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1f250 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1f260 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1f270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1f280 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1f290 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1f2a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1f2b0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1f2c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1f2d0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1f2e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f2f0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1f300 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
1f310 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1f320 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
1f330 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
1f340 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
1f350 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
1f360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f370 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1f380 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
1f390 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
1f3a0 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
1f3b0 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
1f3c0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
1f3d0 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
1f3e0 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
1f3f0 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
1f400 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d  key if skipKey==
1f410 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20  0 and it points 
1f420 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
1f430 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73   of data if.** s
1f440 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20  kipKey==1.  The 
1f450 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1f460 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79  of available key
1f470 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
1f480 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  .** into *pAmt. 
1f490 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
1f4a0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
1f4b0 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
1f4c0 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69  e.** a valid poi
1f4d0 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
1f4e0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
1f4f0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
1f500 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
1f510 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
1f520 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
1f530 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
1f540 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
1f550 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
1f560 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
1f570 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
1f580 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1f590 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
1f5a0 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
1f5b0 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
1f5c0 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
1f5d0 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
1f5e0 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
1f5f0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
1f600 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
1f610 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
1f620 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
1f630 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
1f640 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
1f650 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
1f660 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
1f670 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
1f680 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
1f690 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
1f6a0 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
1f6b0 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
1f6c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1f6d0 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
1f6e0 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
1f6f0 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
1f700 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
1f710 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
1f720 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
1f730 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68  gned char *fetch
1f740 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
1f750 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
1f760 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
1f770 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
1f780 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
1f790 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20  t *pAmt,        
1f7a0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1f7b0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1f7c0 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
1f7d0 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20  /.  int skipKey 
1f7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64           /* read
1f7f0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61   beginning at da
1f800 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
1f810 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
1f820 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
1f830 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ad;.  MemPage *p
1f840 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Page;.  u32 nKey
1f850 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a  ;.  u32 nLocal;.
1f860 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
1f870 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
1f880 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
1f890 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f8a0 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
1f8b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f8c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1f8d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1f8e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1f8f0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1f900 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1f910 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
1f920 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f930 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
1f940 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45  Cell );.  if( NE
1f950 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  VER(pCur->info.n
1f960 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Size==0) ){.    
1f970 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1f980 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1f990 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  ->iPage], pCur->
1f9a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1f9b0 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
1f9c0 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e         &pCur->in
1f9d0 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c  fo);.  }.  aPayl
1f9e0 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1f9f0 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
1fa00 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
1fa10 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
1fa20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1fa30 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
1fa40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
1fa50 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
1fa60 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  fo.nKey;.  }.  i
1fa70 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1fa80 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    aPayload += nK
1fa90 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  ey;.    nLocal =
1faa0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1fab0 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c  al - nKey;.  }el
1fac0 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
1fad0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1fae0 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  al;.    assert( 
1faf0 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a  nLocal<=nKey );.
1fb00 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c    }.  *pAmt = nL
1fb10 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  ocal;.  return a
1fb20 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
1fb30 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
1fb40 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
1fb50 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
1fb60 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
1fb70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
1fb80 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
1fb90 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
1fba0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
1fbb0 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
1fbc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
1fbd0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
1fbe0 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
1fbf0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1fc00 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
1fc10 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
1fc20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
1fc30 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
1fc40 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
1fc50 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
1fc60 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
1fc70 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
1fc80 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
1fc90 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
1fca0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
1fcb0 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
1fcc0 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
1fcd0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
1fce0 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
1fcf0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
1fd00 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
1fd10 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
1fd20 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
1fd30 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
1fd40 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
1fd50 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
1fd60 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
1fd70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
1fd80 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
1fd90 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1fda0 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63   int *pAmt){.  c
1fdb0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30  onst void *p = 0
1fdc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1fdd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1fde0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1fdf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1fe00 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1fe10 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1fe20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
1fe30 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1fe40 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
1fe50 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
1fe60 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1fe70 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d  r, pAmt, 0);.  }
1fe80 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63  .  return p;.}.c
1fe90 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
1fea0 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
1feb0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1fec0 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63   int *pAmt){.  c
1fed0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30  onst void *p = 0
1fee0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1fef0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1ff00 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1ff10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1ff20 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ff30 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ff40 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
1ff50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ff60 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
1ff70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
1ff80 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1ff90 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
1ffa0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
1ffb0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1ffc0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
1ffd0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
1ffe0 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
1fff0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
20000 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
20010 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
20020 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
20030 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
20040 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
20050 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
20060 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
20070 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
20080 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
20090 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
200a0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
200b0 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
200c0 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
200d0 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
200e0 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
200f0 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
20100 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
20110 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
20120 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
20130 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
20140 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
20150 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
20160 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  i = pCur->iPage;
20170 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
20180 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
20190 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
201a0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
201b0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
201c0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
201d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
201e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
201f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20200 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
20210 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66  AX_DEPTH );.  if
20220 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
20230 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
20240 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
20250 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20260 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
20270 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
20280 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
20290 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69   &pNewPage);.  i
202a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
202b0 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
202c0 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
202d0 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
202e0 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
202f0 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
20300 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
20310 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
20320 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
20330 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
20340 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d  l<1 || pNewPage-
20350 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61  >intKey!=pCur->a
20360 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79  pPage[i]->intKey
20370 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
20380 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
20390 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
203a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
203b0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
203c0 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
203d0 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
203e0 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
203f0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
20400 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
20410 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
20420 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
20430 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
20440 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
20450 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
20460 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
20470 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
20480 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
20490 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
204a0 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
204b0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
204c0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
204d0 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
204e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
204f0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
20500 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
20510 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
20520 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72  iChild){.  asser
20530 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
20540 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
20550 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
20560 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
20570 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
20580 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
20590 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
205a0 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
205b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
205c0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
205d0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
205e0 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
205f0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
20600 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
20610 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
20620 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
20630 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
20640 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
20650 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
20660 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
20670 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
20680 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
20690 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
206a0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
206b0 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
206c0 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
206d0 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
206e0 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
206f0 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
20700 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
20710 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
20720 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
20730 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
20740 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
20750 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
20760 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
20770 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
20780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
20790 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
207a0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
207b0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
207c0 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
207d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
207e0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
207f0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
20800 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
20810 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
20820 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
20830 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20840 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
20850 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20860 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
20870 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
20880 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20890 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
208a0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
208b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
208c0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
208d0 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
208e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
208f0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
20900 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
20910 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
20920 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
20930 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
20940 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
20950 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
20960 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
20970 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
20980 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
20990 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
209a0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
209b0 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
209c0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
209d0 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
209e0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
209f0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
20a00 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
20a10 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
20a20 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
20a30 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
20a40 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
20a50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
20a60 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
20a70 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
20a80 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
20a90 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
20aa0 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
20ab0 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
20ac0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
20ad0 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
20ae0 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
20af0 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
20b00 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
20b10 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
20b20 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
20b30 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
20b40 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
20b50 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
20b60 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
20b70 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
20b80 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
20b90 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
20ba0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
20bb0 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
20bc0 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
20bd0 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
20be0 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
20bf0 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
20c00 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
20c10 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
20c20 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
20c30 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
20c40 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
20c50 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
20c60 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
20c70 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
20c80 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
20c90 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
20ca0 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
20cb0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
20cc0 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
20cd0 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
20ce0 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
20cf0 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
20d00 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
20d10 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
20d20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
20d30 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
20d40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20d50 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
20d60 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
20d70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20d80 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
20d90 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20da0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
20db0 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
20dc0 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
20dd0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
20de0 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
20df0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
20e00 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
20e10 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
20e20 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
20e30 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
20e40 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
20e50 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
20e60 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
20e70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20e80 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
20e90 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
20ea0 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
20eb0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65  E_OK );.      re
20ec0 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
20ed0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
20ee0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
20ef0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
20f00 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
20f10 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
20f20 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
20f30 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  1; i<=pCur->iPag
20f40 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
20f50 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
20f60 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
20f70 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
20f80 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ge = 0;.  }else{
20f90 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
20fa0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
20fb0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
20fc0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b  Cur->apPage[0]);
20fd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20fe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20ff0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
21000 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
21010 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21020 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
21030 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  iPage = 0;..    
21040 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
21050 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
21060 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
21070 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
21080 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a  is cursor.    **
21090 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
210a0 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
210b0 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
210c0 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
210d0 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20  is.    ** NULL, 
210e0 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
210f0 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
21100 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
21110 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20  t the case,.    
21120 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
21130 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
21140 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  r.  */.    asser
21150 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
21160 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  0]->intKey==1 ||
21170 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
21180 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
21190 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b     if( (pCur->pK
211a0 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72  eyInfo==0)!=pCur
211b0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
211c0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
211d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
211e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
211f0 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20   }..  /* Assert 
21200 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61  that the root pa
21210 67 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72  ge is of the cor
21220 72 65 63 74 20 74 79 70 65 2e 20 54 68 69 73 20  rect type. This 
21230 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a  must be the.  **
21240 20 63 61 73 65 20 61 73 20 74 68 65 20 63 61 6c   case as the cal
21250 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  l to this functi
21260 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74  on that loaded t
21270 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69  he root-page (ei
21280 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63  ther.  ** this c
21290 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75  all or a previou
212a0 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f  s invocation) wo
212b0 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
212c0 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20  d corruption .  
212d0 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d 70  ** if the assump
212e0 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72  tion were not tr
212f0 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  ue, and it is no
21300 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
21310 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62  he flags .  ** b
21320 79 74 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e  yte to have been
21330 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20   modified while 
21340 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 68  this cursor is h
21350 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
21360 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70  ce.  ** to the p
21370 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74  age.  */.  pRoot
21380 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
21390 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
213a0 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
213b0 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61  >pgnoRoot );.  a
213c0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73  ssert( pRoot->is
213d0 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70  Init && (pCur->p
213e0 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f  KeyInfo==0)==pRo
213f0 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20  ot->intKey );.. 
21400 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
21410 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
21420 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
21430 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
21440 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
21450 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ey = 0;..  if( p
21460 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
21470 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
21480 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
21490 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
214a0 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
214b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
214c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
214d0 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
214e0 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
214f0 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
21500 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
21510 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
21520 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
21530 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
21540 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
21550 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
21560 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e  ate = ((pRoot->n
21570 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
21580 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
21590 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LID);.  }.  retu
215a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
215b0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
215c0 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
215d0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
215e0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
215f0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
21600 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
21610 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
21620 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
21630 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
21640 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
21650 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
21660 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
21670 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
21680 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
21690 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
216a0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
216b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
216c0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
216d0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
216e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
216f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21700 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21710 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21720 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
21730 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21740 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
21750 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21760 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
21770 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21780 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21790 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
217a0 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
217b0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
217c0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
217d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
217e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
217f0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
21800 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
21810 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
21820 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
21830 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
21840 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
21850 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
21860 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
21870 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
21880 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
21890 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
218a0 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
218b0 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
218c0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
218d0 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
218e0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
218f0 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
21900 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
21910 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
21920 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
21930 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
21940 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
21950 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
21960 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
21970 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
21980 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
21990 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
219a0 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
219b0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
219c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
219d0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
219e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
219f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
21a00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21a10 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
21a20 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
21a30 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21a40 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21a50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
21a60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21a70 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
21a80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21a90 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
21aa0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21ab0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
21ac0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
21ad0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
21ae0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
21af0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
21b00 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
21b10 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
21b20 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
21b30 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
21b40 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
21b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21b60 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
21b70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
21b80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
21b90 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
21ba0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
21bb0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
21bc0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
21bd0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
21be0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
21bf0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
21c00 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
21c10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
21c20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
21c30 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
21c40 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
21c50 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
21c60 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
21c70 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
21c80 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
21c90 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
21ca0 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
21cb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
21cc0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
21cd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
21ce0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21cf0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21d00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
21d10 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
21d20 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
21d30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
21d40 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
21d50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21d60 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
21d70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
21d80 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
21d90 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21da0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
21db0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
21dc0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
21dd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21de0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
21df0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
21e00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21e10 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
21e20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
21e30 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
21e40 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
21e50 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
21e60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21e70 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
21e80 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
21e90 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
21ea0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
21eb0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
21ec0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
21ed0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
21ee0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
21ef0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
21f00 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
21f10 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
21f20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
21f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
21f40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
21f50 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
21f60 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
21f70 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21f80 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21f90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21fa0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
21fb0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
21fc0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
21fd0 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
21fe0 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
21ff0 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
22000 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
22010 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
22020 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
22030 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73  e && pCur->atLas
22040 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  t ){.#ifdef SQLI
22050 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
22060 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
22070 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
22080 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
22090 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
220a0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
220b0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
220c0 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
220d0 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
220e0 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
220f0 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
22100 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22110 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
22120 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
22130 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
22140 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22150 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22160 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
22170 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22180 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
22190 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
221a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
221b0 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
221c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
221d0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
221e0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
221f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22200 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
22210 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
22220 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
22230 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22240 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22250 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
22260 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
22270 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
22280 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
22290 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
222a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
222b0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
222c0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
222d0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
222e0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
222f0 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
22300 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d  E_OK ?1:0;.    }
22310 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22320 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
22330 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
22340 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
22350 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
22360 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
22370 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
22380 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
22390 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
223a0 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
223b0 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
223c0 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
223d0 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
223e0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
223f0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
22400 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
22410 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
22420 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
22430 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
22440 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
22450 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
22460 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
22470 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
22480 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
22490 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
224a0 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
224b0 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
224c0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
224d0 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
224e0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
224f0 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
22500 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
22510 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
22520 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
22530 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
22540 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
22550 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
22560 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
22570 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
22580 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
22590 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
225a0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
225b0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
225c0 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
225d0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
225e0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
225f0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
22600 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
22610 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
22620 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
22630 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
22640 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
22650 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
22660 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
22670 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
22680 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
22690 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
226a0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
226b0 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
226c0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
226d0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
226e0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
226f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
22700 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
22710 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
22720 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
22730 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
22740 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
22750 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
22760 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
22770 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
22780 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
22790 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
227a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
227b0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
227c0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
227d0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
227e0 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
227f0 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
22800 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
22810 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
22820 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
22830 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
22840 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
22850 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
22860 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
22870 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
22880 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
22890 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
228a0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
228d0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
228e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
228f0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
22900 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
22910 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
22920 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
22930 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
22940 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
22950 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
22960 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
22970 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
22980 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Info==0) );..  /
22990 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
229a0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
229b0 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
229c0 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
229d0 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
229e0 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
229f0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
22a00 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
22a10 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
22a20 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
22a30 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
22a40 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70   .   && pCur->ap
22a50 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
22a60 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
22a70 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
22a80 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
22a90 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
22aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
22ac0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20  pCur->atLast && 
22ad0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
22ae0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
22af0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
22b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22b10 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
22b20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
22b30 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
22b40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22b50 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
22b60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22b70 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
22b80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
22b90 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22ba0 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  ]->isInit );.  a
22bb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22bc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22bd0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75  ->nCell>0 || pCu
22be0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22bf0 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69  R_INVALID );.  i
22c00 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
22c10 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
22c20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
22c30 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
22c40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22c50 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
22c60 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
22c70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22c80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22c90 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
22ca0 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
22cb0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
22cc0 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
22cd0 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
22ce0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
22cf0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
22d00 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
22d10 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a    int c;..    /*
22d20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
22d30 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
22d40 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
22d50 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
22d60 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
22d70 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
22d80 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
22d90 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
22da0 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
22db0 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
22dc0 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
22dd0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
22de0 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
22df0 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
22e00 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
22e10 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
22e20 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
22e30 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
22e40 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
22e50 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
22e60 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
22e70 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
22e80 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
22e90 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
22ea0 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
22eb0 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
22ec0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
22ed0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22ee0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
22ef0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22f00 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
22f10 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
22f20 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
22f30 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
22f40 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67  .    if( biasRig
22f50 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ht ){.      pCur
22f60 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22f70 61 67 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b  age] = (u16)upr;
22f80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22f90 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
22fa0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
22fb0 36 29 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b  6)((upr+lwr)/2);
22fc0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b  .    }.    for(;
22fd0 3b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  ;){.      int id
22fe0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
22ff0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
23000 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
23010 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
23020 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  */.      u8 *pCe
23030 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23050 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
23060 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
23070 20 2a 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d   */..      pCur-
23080 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23090 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  .      pCell = f
230a0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
230b0 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
230c0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
230d0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
230e0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  ey ){.        i6
230f0 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
23100 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
23110 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
23120 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
23130 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
23140 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
23150 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  ell, dummy);.   
23160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
23170 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
23180 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
23190 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
231a0 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
231b0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
231c0 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
231d0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
231e0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
231f0 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
23200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23210 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
23220 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  Key>intKey );.  
23230 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
23240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23250 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
23260 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
23270 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
23280 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
23290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
232a0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
232b0 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
232c0 7a 65 20 69 73 20 33 32 37 36 38 20 62 79 74 65  ze is 32768 byte
232d0 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
232e0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
232f0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
23300 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
23310 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
23320 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
23330 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 61 74     ** page is at
23340 20 6d 6f 73 74 20 38 31 39 38 20 62 79 74 65 73   most 8198 bytes
23350 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73  , which may be s
23360 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
23370 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
23380 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
23390 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
233a0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
233b0 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
233c0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
233d0 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
233e0 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
233f0 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
23400 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
23410 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
23420 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
23430 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
23440 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
23450 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
23460 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
23470 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
23480 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70     int nCell = p
23490 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
234a0 20 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30   if( !(nCell & 0
234b0 78 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70  x80) && nCell<=p
234c0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
234d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
234e0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
234f0 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
23500 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
23510 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
23520 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
23530 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
23540 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
23550 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
23560 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
23570 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
23580 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
23590 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
235a0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
235b0 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
235c0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
235d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
235e0 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
235f0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
23600 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
23610 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
23620 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
23630 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b  Local.        ){
23640 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
23650 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
23660 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
23670 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
23680 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
23690 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
236a0 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
236b0 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
236c0 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
236d0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
236e0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
236f0 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
23700 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
23710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23720 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
23730 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
23740 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
23750 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
23760 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
23770 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
23780 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
23790 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
237a0 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
237b0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
237c0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
237d0 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
237e0 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
237f0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
23800 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
23810 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
23820 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
23830 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
23840 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
23850 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
23860 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
23870 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
23880 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
23890 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
238a0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
238b0 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
238c0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
238d0 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
238e0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
238f0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
23900 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
23910 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  c( nCell );.    
23920 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
23930 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
23940 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23950 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
23960 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
23970 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
23980 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
23990 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
239a0 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
239b0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
239c0 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20  )pCellKey, 0);. 
239d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
239e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
239f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
23a00 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
23a10 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
23a20 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
23a30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
23a40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
23a50 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
23a60 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
23a70 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
23a80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
23a90 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
23aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23ab0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
23ac0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
23ad0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
23ae0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
23af0 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
23b00 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
23b10 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
23b20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
23b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23b40 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
23b50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23b60 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
23b70 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
23b80 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
23b90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
23ba0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
23bb0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
23bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23bd0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
23be0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
23bf0 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
23c00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
23c10 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
23c20 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
23c30 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70 72  = (u16)((lwr+upr
23c40 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
23c50 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
23c60 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
23c70 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
23c80 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
23c90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
23ca0 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
23cb0 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
23cc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
23cd0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
23ce0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
23cf0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
23d00 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
23d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
23d20 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
23d30 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
23d40 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
23d50 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
23d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
23d70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23d80 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
23d90 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23da0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
23db0 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
23dc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23dd0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
23de0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
23df0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
23e00 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
23e10 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70   (u16)lwr;.    p
23e20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
23e30 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
23e40 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
23e50 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
23e60 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
23e70 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
23e80 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
23e90 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  h;.  }.moveto_fi
23ea0 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72  nish:.  return r
23eb0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
23ec0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
23ed0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
23ee0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
23ef0 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
23f00 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
23f10 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
23f20 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
23f30 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
23f40 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
23f50 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
23f60 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
23f70 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
23f80 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
23f90 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
23fa0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
23fb0 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
23fc0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
23fd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23fe0 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
23ff0 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
24000 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
24010 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
24020 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
24030 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
24040 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
24050 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
24060 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
24070 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
24080 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
24090 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
240a0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
240b0 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
240c0 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
240d0 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
240e0 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
240f0 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
24100 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
24110 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
24120 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
24130 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
24140 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
24150 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
24160 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
24170 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
24180 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24190 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
241a0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
241b0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
241c0 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
241d0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
241e0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
241f0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
24200 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
24210 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
24220 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
24230 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
24240 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
24250 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
24260 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
24270 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24280 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24290 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
242a0 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43  es!=0 );.  if( C
242b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
242c0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
242d0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
242e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
242f0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
24300 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
24310 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
24320 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Next = 0;.    *p
24330 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
24340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24350 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e   }.  pCur->skipN
24360 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  ext = 0;..  pPag
24370 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
24380 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
24390 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
243a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
243b0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
243c0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
243d0 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61  assert( idx<=pPa
243e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
243f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
24400 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
24410 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
24420 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
24430 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
24440 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
24450 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
24460 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
24470 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
24480 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
24490 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
244a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
244b0 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
244c0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
244d0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
244e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
244f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24500 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
24510 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
24520 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
24530 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
24540 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
24550 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
24560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24570 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
24580 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
24590 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
245a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
245b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
245c0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
245d0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
245e0 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
245f0 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
24600 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
24610 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
24620 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24630 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
24640 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
24650 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
24660 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
24670 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24680 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
24690 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
246a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
246b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
246c0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
246d0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
246e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
246f0 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
24700 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
24710 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
24720 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
24730 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
24740 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
24750 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
24760 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
24770 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
24780 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
24790 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
247a0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
247b0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
247c0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
247d0 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
247e0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
247f0 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
24800 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
24810 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
24820 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
24830 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24840 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24850 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
24860 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
24870 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
24880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24890 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
248a0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
248b0 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  0;.  if( CURSOR_
248c0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
248d0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
248e0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
248f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24900 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
24910 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
24920 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
24930 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
24940 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
24950 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
24960 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
24970 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
24980 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24990 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
249a0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
249b0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
249c0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
249d0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
249e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
249f0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
24a00 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
24a10 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
24a20 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
24a30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24a40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24a50 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
24a60 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
24a70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24a80 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
24a90 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
24aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
24ab0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
24ac0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
24ad0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24ae0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
24af0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
24b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24b10 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
24b20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
24b30 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
24b40 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
24b50 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
24b60 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
24b70 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
24b80 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
24b90 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
24ba0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24bb0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
24bc0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
24bd0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
24be0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24bf0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
24c00 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
24c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24c30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
24c40 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
24c50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
24c60 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
24c70 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
24c80 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
24c90 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
24ca0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
24cb0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
24cc0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
24cd0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
24ce0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
24cf0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
24d00 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
24d10 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
24d20 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
24d30 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
24d40 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
24d50 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
24d60 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
24d70 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
24d80 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
24d90 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
24da0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
24db0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
24dc0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
24dd0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
24de0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
24df0 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
24e00 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
24e10 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
24e20 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
24e30 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
24e40 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
24e50 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
24e60 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
24e70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
24e80 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
24e90 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
24ea0 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
24eb0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
24ec0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
24ed0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
24ee0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
24ef0 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
24f00 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
24f10 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
24f20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
24f30 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
24f40 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
24f50 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
24f60 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
24f70 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
24f80 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
24f90 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
24fa0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
24fb0 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
24fc0 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
24fd0 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
24fe0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
24ff0 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
25000 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
25010 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
25020 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
25030 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
25040 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
25050 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
25060 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
25070 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
25080 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
25090 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
250a0 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
250b0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
250c0 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
250d0 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
250e0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
250f0 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
25100 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25110 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
25120 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
25130 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
25140 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
25150 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
25160 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
25170 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
25180 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
25190 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
251a0 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
251b0 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
251c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
251d0 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
251e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
251f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
25200 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
25210 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
25220 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
25230 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d  ount(pBt);.  n =
25240 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
25250 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
25260 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
25270 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
25280 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
25290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
252a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
252b0 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
252c0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
252d0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
252e0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
252f0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
25300 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
25310 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
25320 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
25330 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
25340 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
25350 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
25360 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
25370 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
25380 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
25390 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
253a0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
253b0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
253c0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
253d0 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
253e0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
253f0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
25400 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
25410 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
25420 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
25430 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
25440 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
25450 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
25460 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61   && nearby<=mxPa
25470 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  ge ){.      u8 e
25480 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
25490 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
254a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
254b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
254c0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
254d0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
254e0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
254f0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
25500 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
25510 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
25520 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
25530 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
25540 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
25550 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
25560 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
25570 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
25580 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
25590 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
255a0 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
255b0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
255c0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
255d0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
255e0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
255f0 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
25600 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25610 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
25620 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
25630 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
25640 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
25650 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
25660 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
25670 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
25680 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
25690 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
256a0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
256b0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
256c0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
256d0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
256e0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
256f0 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
25700 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
25710 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
25720 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
25730 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
25740 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
25750 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
25760 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
25770 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
25780 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
25790 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
257a0 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
257b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
257c0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
257d0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
257e0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
257f0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
25800 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
25810 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
25820 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
25830 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25840 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25850 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25860 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
25870 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
25880 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
25890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
258a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
258b0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
258c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
258d0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
258e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d      }..      k =
258f0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
25900 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
25910 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
25920 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
25930 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
25940 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
25950 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
25960 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
25970 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
25980 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
25990 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
259a0 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
259b0 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
259c0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
259d0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
259e0 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
259f0 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
25a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25a10 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
25a20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
25a30 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
25a40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
25a50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
25a60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25a70 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
25a80 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
25a90 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
25aa0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
25ab0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
25ac0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
25ad0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
25ae0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
25af0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
25b00 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
25b10 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
25b20 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
25b30 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
25b40 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
25b50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
25b60 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
25b70 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
25b80 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
25b90 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
25ba0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
25bb0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
25bc0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
25bd0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25be0 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
25bf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
25c00 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
25c10 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
25c20 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72  t && nearby==iTr
25c30 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
25c40 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
25c50 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
25c60 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
25c70 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
25c80 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
25c90 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
25ca0 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
25cb0 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
25cc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
25cd0 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72  ert( *pPgno==iTr
25ce0 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  unk );.        *
25cf0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
25d00 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
25d10 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
25d20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25d30 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
25d40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
25d50 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25d60 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
25d70 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
25d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25d90 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
25da0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
25db0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
25dc0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
25dd0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
25de0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
25df0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
25e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25e10 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
25e20 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
25e30 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
25e40 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
25e50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
25e60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
25e70 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
25e80 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
25e90 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
25ea0 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
25eb0 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
25ec0 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
25ed0 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
25ee0 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
25ef0 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
25f00 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
25f10 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
25f20 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
25f30 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
25f40 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
25f50 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
25f60 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
25f70 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
25f80 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
25f90 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
25fa0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25fb0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
25fd0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
25fe0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
25ff0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
26000 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
26010 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
26020 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
26030 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
26040 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
26050 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
26060 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
26080 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
26090 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
260a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
260b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
260c0 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
260d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
260e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
260f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26100 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
26110 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
26120 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
26130 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
26140 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26150 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
26160 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
26170 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
26180 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
26190 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
261a0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
261b0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
261c0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
261d0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
261e0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
261f0 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
26200 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
26210 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
26220 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26230 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
26240 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
26250 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
26260 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
26270 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
26280 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
26290 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
262a0 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
262b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
262c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
262d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
262e0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
262f0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
26300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26320 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
26330 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
26340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26350 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
26360 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
26370 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
26380 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
263a0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
263b0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
263c0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
263d0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
263e0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
263f0 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
26400 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
26410 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
26420 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
26430 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
26440 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
26450 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
26460 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
26470 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
26480 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
26490 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63  Data;.        rc
264a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
264b0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
264c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
264d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
264e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
264f0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
26500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
26510 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
26520 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
26530 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
26540 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
26550 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
26560 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62 79     dist = get4by
26570 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
26580 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
26590 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20 64    if( dist<0 ) d
265a0 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20  ist = -dist;.   
265b0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
265c0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
265d0 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
265e0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
265f0 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
26600 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
26610 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64  ( d2<0 ) d2 = -d
26620 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  2;.            i
26630 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20  f( d2<dist ){.  
26640 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
26650 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
26660 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
26670 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
26680 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26690 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
266a0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
266b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
266c0 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
266d0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
266e0 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
266f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
26700 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
26710 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
26720 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
26730 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26740 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
26750 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
26760 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
26770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26780 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
26790 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
267a0 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
267b0 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d  hList || iPage==
267c0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
267d0 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
267e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
267f0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
26800 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
26810 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
26820 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
26830 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
26840 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
26850 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
26860 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
26870 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
26880 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
26890 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
268a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
268b0 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
268c0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
268d0 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
268e0 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
268f0 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
26900 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26910 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
26920 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
26930 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
26940 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
26950 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ble(pTrunk->pDbP
26960 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
26970 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
26980 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
26990 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a  t(pBt, *pPgno);.
269a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
269b0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
269c0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
269d0 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
269e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
269f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26a10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
26a20 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
26a30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26a40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26a50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
26a60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
26a70 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
26a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26a90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
26aa0 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
26ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26ac0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
26ad0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
26ae0 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
26af0 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
26b00 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
26b10 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
26b20 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
26b30 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
26b40 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65  , so create a ne
26b50 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20 20  w page at the.  
26b60 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
26b70 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  file */.    int 
26b80 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
26b90 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
26ba0 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20   *pPgno = nPage 
26bb0 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70  + 1;..    if( *p
26bc0 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
26bd0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
26be0 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b        (*pPgno)++
26bf0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
26c00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26c10 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
26c20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
26c30 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
26c40 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b  (pBt, *pPgno) ){
26c50 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
26c60 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
26c70 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
26c80 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
26c90 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
26ca0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
26cb0 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
26cc0 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
26cd0 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
26ce0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
26cf0 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
26d00 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
26d10 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
26d20 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
26d30 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
26d40 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
26d50 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
26d60 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
26d70 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
26d80 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
26d90 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20   *pPgno));.     
26da0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
26db0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
26dc0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
26dd0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
26de0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
26df0 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
26e00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26e10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
26e20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
26e30 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
26e40 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
26e50 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
26e60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
26e70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
26e80 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
26e90 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e  .      if( *pPgn
26ea0 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
26eb0 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70  PAGE(pBt) ){ (*p
26ec0 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d  Pgno)++; }.    }
26ed0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73 73  .#endif..    ass
26ee0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
26ef0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
26f00 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  Bt) );.    rc = 
26f10 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
26f20 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
26f30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
26f40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
26f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26f60 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
26f70 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
26f80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26f90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
26fa0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
26fb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
26fc0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
26fd0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
26fe0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
26ff0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
27000 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
27010 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
27020 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
27030 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
27040 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
27050 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
27060 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63  Trunk);.  if( rc
27070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27080 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
27090 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
270a0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
270b0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
270c0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
270d0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
270e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
270f0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
27100 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
27110 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
27120 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
27130 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27140 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
27150 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
27160 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
27170 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
27180 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
27190 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
271a0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
271b0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
271c0 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
271d0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
271e0 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
271f0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
27200 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
27210 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
27220 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
27230 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
27240 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
27250 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
27260 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
27270 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
27280 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
27290 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
272a0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
272b0 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
272c0 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
272d0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
272e0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
272f0 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
27300 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
27310 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
27320 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
27330 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
27340 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
27350 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
27360 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
27370 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
27380 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
27390 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
273a0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
273b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
273c0 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
273d0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
273e0 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27400 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
27410 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
27420 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
27430 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
27440 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
27450 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
27460 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
27470 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
27480 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
27490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
274a0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
274b0 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
274c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
274f0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
27500 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
27510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27520 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
27530 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
27540 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
27550 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
27560 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
27570 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
27580 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
27590 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
275a0 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
275b0 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
275c0 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
275d0 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
275e0 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
275f0 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
27600 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
27610 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
27620 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
27630 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
27640 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
27650 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
27660 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
27670 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
27680 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
27690 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
276a0 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
276b0 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
276c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
276d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
276e0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
276f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
27700 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66 64 65  nFree+1);..#ifde
27710 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
27720 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
27730 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
27740 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
27750 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
27760 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
27770 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
27780 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
27790 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
277a0 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
277b0 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
277c0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
277d0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
277e0 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c  Page, 0))).   ||
277f0 20 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20              (rc 
27800 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
27810 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
27820 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f  ge)).  ){.    go
27830 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
27840 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50  .  }.  memset(pP
27850 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
27860 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
27870 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ize);.#endif..  
27880 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
27890 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
278a0 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
278b0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
278c0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
278d0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
278e0 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
278f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
27900 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
27910 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
27920 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
27930 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
27940 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
27950 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
27960 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
27970 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
27980 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
27990 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
279a0 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
279b0 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
279c0 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
279d0 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
279e0 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
279f0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
27a00 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
27a10 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
27a20 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
27a30 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
27a40 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
27a50 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
27a60 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
27a70 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
27a80 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
27a90 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
27aa0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
27ab0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
27ac0 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
27ad0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
27ae0 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
27af0 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
27b00 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
27b10 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
27b20 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
27b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27b40 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
27b50 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
27b60 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
27b70 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
27b80 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
27b90 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
27ba0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
27bb0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
27bc0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
27bd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27be0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
27bf0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
27c00 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
27c10 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
27c20 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
27c30 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
27c40 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
27c50 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
27c60 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
27c70 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
27c80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27c90 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
27ca0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
27cb0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
27cc0 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
27cd0 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
27ce0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
27cf0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
27d00 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
27d10 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
27d20 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
27d30 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
27d40 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
27d50 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
27d60 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
27d70 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
27d80 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
27d90 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
27da0 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
27db0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
27dc0 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
27dd0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
27de0 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
27df0 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
27e00 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
27e10 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
27e20 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
27e30 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
27e40 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
27e50 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
27e60 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
27e70 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
27e80 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
27e90 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
27ea0 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
27eb0 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
27ec0 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
27ed0 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
27ee0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
27ef0 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
27f00 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
27f10 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
27f20 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
27f30 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
27f40 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
27f50 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
27f60 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
27f70 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
27f80 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
27f90 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
27fa0 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
27fb0 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
27fc0 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
27fd0 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
27fe0 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
27ff0 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
28000 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
28010 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
28020 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
28030 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
28040 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
28050 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
28060 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
28070 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
28080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28090 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
280a0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
280b0 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
280c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
280d0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
280e0 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
280f0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
28100 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
28110 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
28120 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
28130 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
28140 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
28150 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
28160 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72  #endif.        r
28170 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
28180 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
28190 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
281a0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
281b0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
281c0 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
281d0 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
281e0 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
281f0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
28200 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
28210 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
28220 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
28230 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
28240 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
28250 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
28260 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
28270 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
28280 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
28290 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
282a0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
282b0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
282c0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
282d0 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
282e0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
282f0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
28300 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
28310 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
28320 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
28330 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
28340 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
28350 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
28360 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
28370 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
28380 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
28390 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
283a0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
283b0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
283c0 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
283d0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
283e0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
283f0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
28400 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
28410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28420 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
28430 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
28440 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
28450 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
28460 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
28470 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
28480 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
28490 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
284a0 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
284b0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
284c0 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
284d0 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
284e0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
284f0 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
28500 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
28510 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
28520 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
28530 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
28540 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
28550 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
28560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
28570 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
28580 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
28590 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
285a0 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
285b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
285c0 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
285d0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
285e0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
285f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
28600 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
28610 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
28620 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
28630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28640 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
28650 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
28660 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
28670 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
28680 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
28690 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
286a0 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
286b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
286c0 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76   nOvfl;.  u16 ov
286d0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
286e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
286f0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
28700 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
28710 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
28720 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
28730 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
28740 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
28750 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
28760 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
28770 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
28780 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
28790 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
287a0 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
287b0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
287c0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
287d0 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
287e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
287f0 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
28800 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
28810 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
28820 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
28830 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
28840 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
28850 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
28860 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
28870 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
28880 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
28890 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
288a0 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
288b0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
288c0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
288d0 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
288e0 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61  ovflPgno>pagerPa
288f0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
28900 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
28910 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
28920 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
28930 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
28940 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
28950 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
28960 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
28970 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
28980 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
28990 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
289a0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
289b0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
289c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
289d0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
289e0 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
289f0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
28a00 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
28a10 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
28a20 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
28a30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
28a40 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
28a50 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
28a60 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
28a70 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 76 66  o);.    if( pOvf
28a80 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
28a90 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
28aa0 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
28ab0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
28ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28ad0 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
28ae0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
28af0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
28b00 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
28b10 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
28b20 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
28b30 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
28b40 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
28b50 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
28b60 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
28b70 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
28b80 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
28b90 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
28ba0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
28bb0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
28bc0 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
28bd0 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
28be0 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
28bf0 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
28c00 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
28c10 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
28c20 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
28c30 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
28c40 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
28c50 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
28c60 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
28c70 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
28c80 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
28c90 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
28ca0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
28cb0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
28cc0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
28cd0 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
28ce0 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
28cf0 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
28d00 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
28d10 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
28d20 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
28d30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
28d40 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
28d50 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
28d60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
28d70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
28d80 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
28d90 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
28da0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
28db0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
28dc0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
28dd0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
28de0 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
28df0 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
28e00 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e20 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
28e30 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
28e40 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
28e50 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
28e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
28e70 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
28e80 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
28e90 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
28ea0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
28eb0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
28ec0 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
28ed0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
28ee0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
28ef0 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
28f00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
28f10 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
28f20 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
28f30 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
28f40 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
28f50 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
28f60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
28f70 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
28f80 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
28f90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
28fa0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
28fb0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
28fc0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
28fd0 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
28fe0 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
28ff0 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
29000 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
29010 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
29020 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
29030 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
29040 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
29050 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
29060 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
29070 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
29080 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
29090 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
290a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
290b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
290c0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
290d0 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
290e0 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
290f0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
29100 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
29110 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
29120 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
29130 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
29140 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
29150 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
29160 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
29170 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
29180 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
29190 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
291a0 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
291b0 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
291c0 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  y);.  btreeParse
291d0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
291e0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
291f0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
29200 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
29210 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
29220 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
29230 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
29240 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
29250 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
29260 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
29270 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
29280 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
29290 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
292a0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
292b0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
292c0 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
292d0 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
292e0 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
292f0 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66   NEVER(nKey>0x7f
29300 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d  ffffff || pKey==
29310 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
29320 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29330 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
29340 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
29350 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
29360 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
29370 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
29380 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
29390 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
293a0 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
293b0 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
293c0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
293d0 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
293e0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
293f0 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
29400 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
29410 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
29420 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
29430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
29440 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
29450 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
29460 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
29470 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
29480 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
29490 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
294a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
294b0 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
294c0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
294d0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
294e0 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
294f0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
29500 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
29510 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
29520 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
29530 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
29540 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
29550 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
29560 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
29570 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
29580 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
29590 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
295a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
295b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
295c0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
295d0 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
295e0 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
295f0 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
29600 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
29610 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
29620 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
29630 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
29640 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
29650 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
29660 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
29670 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
29680 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
29690 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
296a0 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
296b0 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
296c0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
296d0 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
296e0 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
296f0 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
29700 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
29710 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
29720 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
29730 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
29740 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
29750 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
29760 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
29770 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
29780 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
29790 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
297a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
297b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
297c0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
297d0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
297e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
297f0 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
29800 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
29810 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
29820 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
29830 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
29840 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
29850 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
29860 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
29880 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
29890 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
298a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
298b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
298c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
298d0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
298e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
298f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
29900 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
29910 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
29920 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
29930 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
29940 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
29950 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
29960 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
29970 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
29980 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
29990 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
299a0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
299b0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
299c0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
299d0 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
299e0 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
299f0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
29a00 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
29a10 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
29a20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
29a30 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
29a40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
29a50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
29a60 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
29a70 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
29a80 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
29a90 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
29aa0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
29ab0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
29ac0 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
29ad0 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
29ae0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
29af0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
29b00 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
29b10 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
29b20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
29b30 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
29b40 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
29b50 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
29b60 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
29b70 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
29b80 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
29b90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
29ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
29bb0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
29bc0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
29bd0 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
29be0 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
29bf0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
29c00 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
29c10 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
29c20 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
29c30 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
29c40 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
29c50 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
29c60 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
29c70 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
29c80 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
29c90 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
29ca0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
29cb0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
29cc0 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
29cd0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
29ce0 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
29cf0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
29d00 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
29d10 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
29d20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
29d30 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
29d40 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
29d50 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
29d60 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
29d70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
29d80 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29d90 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
29da0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
29db0 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
29dc0 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
29dd0 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
29de0 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
29df0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
29e00 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
29e10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29e20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
29e30 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
29e40 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
29e50 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
29e60 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
29e70 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
29e80 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
29e90 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
29ea0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
29eb0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
29ec0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
29ed0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
29ee0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
29ef0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
29f00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
29f10 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
29f20 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
29f30 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
29f40 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
29f50 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
29f60 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
29f70 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
29f80 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
29f90 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
29fa0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
29fb0 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
29fc0 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
29fd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
29fe0 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
29ff0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2a000 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
2a010 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
2a020 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
2a030 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
2a040 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
2a050 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
2a060 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2a070 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
2a080 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 6e 74  int *pRC){.  int
2a090 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
2a0a0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2a0b0 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
2a0c0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2a0d0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
2a0e0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
2a0f0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
2a100 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
2a110 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
2a120 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
2a130 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
2a140 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
2a150 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2a160 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
2a170 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2a180 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
2a190 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
2a1a0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
2a1b0 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
2a1c0 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
2a1d0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
2a1e0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
2a1f0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
2a200 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
2a210 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2a220 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
2a230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2a240 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2a250 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2a260 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2a270 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2a280 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2a290 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
2a2a0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2a2b0 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b  ;.  ptr = &data[
2a2c0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2a2d0 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63  t + 2*idx];.  pc
2a2e0 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
2a2f0 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
2a300 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65  >hdrOffset;.  te
2a310 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32  stcase( pc==get2
2a320 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2a330 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ]) );.  testcase
2a340 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e  ( pc+sz==pPage->
2a350 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2a360 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 67 65  );.  if( pc < ge
2a370 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2a380 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
2a390 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2a3a0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
2a3b0 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
2a3c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
2a3d0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
2a3e0 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
2a3f0 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
2a400 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
2a410 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
2a420 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64  ;.  }.  for(i=id
2a430 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  x+1; i<pPage->nC
2a440 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32  ell; i++, ptr+=2
2a450 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  ){.    ptr[0] = 
2a460 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b  ptr[2];.    ptr[
2a470 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d  1] = ptr[3];.  }
2a480 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
2a490 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
2a4a0 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
2a4b0 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
2a4c0 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
2a4d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2a4e0 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
2a4f0 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
2a500 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
2a510 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
2a520 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
2a530 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
2a540 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
2a550 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
2a560 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
2a570 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
2a580 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
2a590 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
2a5a0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
2a5b0 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
2a5c0 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
2a5d0 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
2a5e0 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
2a5f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
2a600 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
2a610 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  aOvfl[] and make
2a620 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
2a630 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
2a640 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
2a650 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
2a660 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
2a670 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
2a680 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
2a690 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
2a6a0 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
2a6b0 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
2a6c0 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
2a6d0 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
2a6e0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69  d..**.** If nSki
2a6f0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
2a700 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20  hen do not copy 
2a710 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
2a720 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  bytes of the.** 
2a730 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72  cell. The caller
2a740 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
2a750 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20  them after this 
2a760 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2a770 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73  . If.** nSkip is
2a780 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
2a790 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f  pCell may not po
2a7a0 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  int to an invali
2a7b0 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  d memory locatio
2a7c0 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c  n .** (but pCell
2a7d0 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73  +nSkip is always
2a7e0 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74   valid)..*/.stat
2a7f0 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65  ic void insertCe
2a800 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
2a810 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20  Page,   /* Page 
2a820 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
2a830 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69  e copying */.  i
2a840 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20  nt i,           
2a850 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63   /* New cell bec
2a860 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65  omes the i-th ce
2a870 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ll of the page *
2a880 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
2a890 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
2a8a0 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c   of the new cell
2a8b0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20   */.  int sz,   
2a8c0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
2a8d0 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70   of content in p
2a8e0 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54  Cell */.  u8 *pT
2a8f0 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
2a900 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63  emp storage spac
2a910 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20  e for pCell, if 
2a920 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f  needed */.  Pgno
2a930 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a   iChild,      /*
2a940 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65   If non-zero, re
2a950 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79  place first 4 by
2a960 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61  tes with this va
2a970 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  lue */.  int *pR
2a980 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  C          /* Re
2a990 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74  ad and write ret
2a9a0 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65  urn code from he
2a9b0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
2a9c0 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dx;          /* 
2a9d0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
2a9e0 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
2a9f0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2aa00 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
2aa10 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2aa20 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
2aa30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2aa40 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
2aa50 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
2aa60 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2aa70 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
2aa80 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
2aa90 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
2aaa0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
2aab0 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
2aac0 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
2aad0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
2aae0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
2aaf0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
2ab00 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
2ab10 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
2ab20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
2ab30 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
2ab40 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
2ab50 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
2ab60 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
2ab70 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69  n data[] */..  i
2ab80 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69  nt nSkip = (iChi
2ab90 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20  ld ? 4 : 0);..  
2aba0 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
2abb0 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  n;..  assert( i>
2abc0 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
2abd0 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
2abe0 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
2abf0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2ac00 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
2ac10 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
2ac20 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34  (pPage->pBt)<=54
2ac30 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  60 );.  assert( 
2ac40 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2ac50 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
2ac60 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61  e->aOvfl) );.  a
2ac70 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2ac80 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2ac90 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ell) );.  assert
2aca0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2acb0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2acc0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
2acd0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2ace0 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
2acf0 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
2ad00 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
2ad10 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53   memcpy(pTemp+nS
2ad20 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  kip, pCell+nSkip
2ad30 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
2ad40 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
2ad50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ad60 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
2ad70 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
2ad80 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
2ad90 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
2ada0 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
2adb0 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73  ssert( j<(int)(s
2adc0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
2add0 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
2ade0 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a  ->aOvfl[0])) );.
2adf0 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
2ae00 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  [j].pCell = pCel
2ae10 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  l;.    pPage->aO
2ae20 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31  vfl[j].idx = (u1
2ae30 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  6)i;.  }else{.  
2ae40 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
2ae50 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2ae60 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2ae70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ae80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
2ae90 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
2aea0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
2aeb0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2aec0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2aed0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2aee0 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
2aef0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
2af00 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
2af10 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
2af20 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66      end = cellOf
2af30 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
2af40 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d  nCell;.    ins =
2af50 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
2af60 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  i;.    rc = allo
2af70 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c  cateSpace(pPage,
2af80 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20   sz, &idx);.    
2af90 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d  if( rc ){ *pRC =
2afa0 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20   rc; return; }. 
2afb0 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61     /* The alloca
2afc0 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e  teSpace() routin
2afd0 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65  e guarantees the
2afe0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70   following two p
2aff0 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a  roperties.    **
2b000 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 73   if it returns s
2b010 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 61 73  uccess */.    as
2b020 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65 6e 64  sert( idx >= end
2b030 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
2b040 28 20 69 64 78 2b 73 7a 20 3c 3d 20 70 50 61 67  ( idx+sz <= pPag
2b050 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2b060 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
2b070 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50  >nCell++;.    pP
2b080 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75  age->nFree -= (u
2b090 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20  16)(2 + sz);.   
2b0a0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
2b0b0 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
2b0c0 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
2b0d0 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
2b0e0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2b0f0 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
2b100 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
2b110 20 20 66 6f 72 28 6a 3d 65 6e 64 2c 20 70 74 72    for(j=end, ptr
2b120 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73  =&data[j]; j>ins
2b130 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b  ; j-=2, ptr-=2){
2b140 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20  .      ptr[0] = 
2b150 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
2b160 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b  tr[1] = ptr[-1];
2b170 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62  .    }.    put2b
2b180 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
2b190 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
2b1a0 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
2b1b0 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
2b1c0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66  age->nCell);.#if
2b1d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b1e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2b1f0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
2b200 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2b210 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
2b220 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
2b230 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
2b240 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
2b250 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
2b260 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
2b270 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
2b280 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
2b290 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
2b2a0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
2b2b0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
2b2c0 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
2b2d0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
2b2e0 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20  *.** Add a list 
2b2f0 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61  of cells to a pa
2b300 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68  ge.  The page sh
2b310 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c  ould be initiall
2b320 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20  y empty..** The 
2b330 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e  cells are guaran
2b340 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74  teed to fit on t
2b350 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
2b360 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65  ic void assemble
2b370 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
2b380 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65  *pPage,   /* The
2b390 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65   page to be asse
2b3a0 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mblied */.  int 
2b3b0 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  nCell,        /*
2b3c0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
2b3d0 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74  ells to add to t
2b3e0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
2b3f0 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
2b400 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63  /* Pointers to c
2b410 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20  ell bodies */.  
2b420 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20  u16 *aSize      
2b430 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68    /* Sizes of th
2b440 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  e cells */.){.  
2b450 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2b460 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2b470 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  r */.  u8 *pCell
2b480 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ptr;     /* Addr
2b490 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
2b4a0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
2b4b0 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20  t cellbody;     
2b4c0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
2b4d0 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a  xt cell body */.
2b4e0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
2b4f0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2b500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2b510 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
2b520 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20   for pPage */.  
2b530 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
2b540 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2b550 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
2b560 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
2b570 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  on pPage */.  co
2b580 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20  nst int nUsable 
2b590 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
2b5a0 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61  ableSize; /* Usa
2b5b0 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65  ble size of page
2b5c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2b5d0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
2b5e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2b5f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2b600 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2b610 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2b620 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e  t( nCell>=0 && n
2b630 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
2b640 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f  age->pBt) && MX_
2b650 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2b660 3c 3d 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65  <=5460 );.  asse
2b670 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2b680 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2b690 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2b6a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2b6b0 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75 73  the page has jus
2b6c0 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  t been zeroed by
2b6d0 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20   zeroPage() */. 
2b6e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b6f0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
2b700 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26  sert( get2byte(&
2b710 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55  data[hdr+5])==nU
2b720 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c  sable );..  pCel
2b730 6c 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61  lptr = &data[pPa
2b740 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
2b750 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c   nCell*2];.  cel
2b760 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b  lbody = nUsable;
2b770 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31  .  for(i=nCell-1
2b780 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
2b790 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b    pCellptr -= 2;
2b7a0 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d  .    cellbody -=
2b7b0 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70   aSize[i];.    p
2b7c0 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72  ut2byte(pCellptr
2b7d0 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20  , cellbody);.   
2b7e0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65   memcpy(&data[ce
2b7f0 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b  llbody], apCell[
2b800 69 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20  i], aSize[i]);. 
2b810 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64   }.  put2byte(&d
2b820 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c  ata[hdr+3], nCel
2b830 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  l);.  put2byte(&
2b840 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c  data[hdr+5], cel
2b850 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d  lbody);.  pPage-
2b860 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c  >nFree -= (nCell
2b870 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63  *2 + nUsable - c
2b880 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
2b890 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29  e->nCell = (u16)
2b8a0 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nCell;.}../*.** 
2b8b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
2b8c0 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69  rameters determi
2b8d0 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61  ne how many adja
2b8e0 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69  cent pages get i
2b8f0 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20  nvolved.** in a 
2b900 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
2b910 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20  ion.  NN is the 
2b920 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  number of neighb
2b930 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2b940 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  de.** of the pag
2b950 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  e that participa
2b960 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
2b970 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
2b980 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74  NB is the.** tot
2b990 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2b9a0 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70  es that particip
2b9b0 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ate, including t
2b9c0 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61  he target page a
2b9d0 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f  nd.** NN neighbo
2b9e0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
2b9f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e  e..**.** The min
2ba00 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e  imum value of NN
2ba10 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65   is 1 (of course
2ba20 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e  ).  Increasing N
2ba30 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f  N above 1.** (to
2ba40 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61   2 or 3) gives a
2ba50 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d   modest improvem
2ba60 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e  ent in SELECT an
2ba70 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d  d DELETE perform
2ba80 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61  ance.** in excha
2ba90 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72  nge for a larger
2baa0 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20   degradation in 
2bab0 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
2bac0 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  E performance..*
2bad0 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e  * The value of N
2bae0 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76  N appears to giv
2baf0 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  e the best resul
2bb00 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23  ts overall..*/.#
2bb10 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20  define NN 1     
2bb20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2bb30 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
2bb40 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
2bb50 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e   pPage */.#defin
2bb60 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20  e NB (NN*2+1)   
2bb70 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65     /* Total page
2bb80 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
2bb90 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23  e balance */...#
2bba0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2bbb0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
2bbc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
2bbd0 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20  on of balance() 
2bbe0 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d  handles the comm
2bbf0 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  on special case 
2bc00 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65  where.** a new e
2bc10 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e  ntry is being in
2bc20 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78  serted on the ex
2bc30 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20  treme right-end 
2bc40 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  of the.** tree, 
2bc50 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
2bc60 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74  when the new ent
2bc70 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ry will become t
2bc80 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e  he largest.** en
2bc90 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e  try in the tree.
2bca0 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f  .**.** Instead o
2bcb0 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61  f trying to bala
2bcc0 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d  nce the 3 right-
2bcd0 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c  most leaf pages,
2bce0 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e   just add.** a n
2bcf0 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72  ew page to the r
2bd00 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61  ight-hand side a
2bd10 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e  nd put the one n
2bd20 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74  ew entry in.** t
2bd30 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  hat page.  This 
2bd40 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74  leaves the right
2bd50 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65   side of the tre
2bd60 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e  e somewhat.** un
2bd70 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f  balanced.  But o
2bd80 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20  dds are that we 
2bd90 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
2bda0 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a  g new entries.**
2bdb0 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e   at the end soon
2bdc0 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74   afterwards so t
2bdd0 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20  he nearly empty 
2bde0 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c  page will quickl
2bdf0 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f  y.** fill up.  O
2be00 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a  n average..**.**
2be10 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65   pPage is the le
2be20 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73  af page which is
2be30 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2be40 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
2be50 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20  ..** pParent is 
2be60 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61  its parent.  pPa
2be70 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73  ge must have a s
2be80 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65  ingle overflow e
2be90 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73  ntry.** which is
2bea0 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
2beb0 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  most entry on th
2bec0 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e page..**.** Th
2bed0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
2bee0 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
2bef0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70   a temporary cop
2bf00 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  y of the divider
2bf10 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69  .** cell that wi
2bf20 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ll be inserted i
2bf30 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63  nto pParent. Suc
2bf40 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  h a cell consist
2bf50 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65  s of a 4.** byte
2bf60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c   page number fol
2bf70 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61  lowed by a varia
2bf80 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2bf90 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  er. In other.** 
2bfa0 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31  words, at most 1
2bfb0 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74  3 bytes. Hence t
2bfc0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
2bfd0 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c   must be at.** l
2bfe0 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e  east 13 bytes in
2bff0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
2c000 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
2c010 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ck(MemPage *pPar
2c020 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  ent, MemPage *pP
2c030 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29  age, u8 *pSpace)
2c040 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f  {.  BtShared *co
2c050 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d  nst pBt = pPage-
2c060 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72  >pBt;    /* B-Tr
2c070 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee Database */. 
2c080 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20   MemPage *pNew; 
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0a0 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
2c0b0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
2c0c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2c0f0 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n Code */.  Pgno
2c100 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20   pgnoNew;       
2c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c120 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2c130 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73  of pNew */..  as
2c140 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2c150 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2c160 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2c170 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c180 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2c190 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2c1a0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
2c1b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2c1c0 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ==1 );..  if( pP
2c1d0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20  age->nCell<=0 ) 
2c1e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2c1f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f  RRUPT_BKPT;..  /
2c200 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
2c210 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65   page. This page
2c220 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2c230 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f   right-sibling o
2c240 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d  f .  ** pPage. M
2c250 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  ake the parent p
2c260 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f  age writable, so
2c270 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69   that the new di
2c280 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20  vider cell.  ** 
2c290 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e  may be inserted.
2c2a0 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f   If both these o
2c2b0 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75  perations are su
2c2c0 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65  ccessful, procee
2c2d0 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  d..  */.  rc = a
2c2e0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2c2f0 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
2c300 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20  noNew, 0, 0);.. 
2c310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c320 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70  OK ){..    u8 *p
2c330 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d  Out = &pSpace[4]
2c340 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  ;.    u8 *pCell 
2c350 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  = pPage->aOvfl[0
2c360 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36  ].pCell;.    u16
2c370 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69   szCell = cellSi
2c380 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2c390 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74  ll);.    u8 *pSt
2c3a0 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  op;..    assert(
2c3b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c3c0 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70  riteable(pNew->p
2c3d0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61  DbPage) );.    a
2c3e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
2c3f0 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54  ata[0]==(PTF_INT
2c400 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
2c410 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20  |PTF_LEAF) );.  
2c420 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
2c430 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
2c440 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
2c450 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  F);.    assemble
2c460 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
2c470 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
2c480 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2c490 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
2c4a0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
2c4b0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
2c4c0 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65  ap.    ** with e
2c4d0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
2c4e0 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
2c4f0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
2c500 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  e .    ** cell o
2c510 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e  n the page to an
2c520 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2c530 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
2c540 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  se.    ** operat
2c550 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20  ions fails, the 
2c560 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
2c570 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74  et, but the cont
2c580 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
2c590 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61  he parent page a
2c5a0 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c  re still manipul
2c5b0 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65  ated by thh code
2c5c0 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54   below..    ** T
2c5d0 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68  hat is Ok, at th
2c5e0 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72  is point the par
2c5f0 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72  ent page is guar
2c600 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  anteed to.    **
2c610 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
2c620 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  rty. Returning a
2c630 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c  n error code wil
2c640 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a  l cause a.    **
2c650 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69   rollback, undoi
2c660 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  ng any changes m
2c670 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ade to the paren
2c680 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
2c690 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2c6a0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72  UUM ){.      ptr
2c6b0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2c6c0 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
2c6d0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
2c6e0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
2c6f0 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d  ( szCell>pNew->m
2c700 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  inLocal ){.     
2c710 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
2c720 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c  Ptr(pNew, pCell,
2c730 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20   &rc);.      }. 
2c740 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43     }.  .    /* C
2c750 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20  reate a divider 
2c760 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69  cell to insert i
2c770 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65  nto pParent. The
2c780 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
2c790 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66    ** consists of
2c7a0 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e   a 4-byte page n
2c7b0 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20  umber (the page 
2c7c0 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29  number of pPage)
2c7d0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61   and.    ** a va
2c7e0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
2c7f0 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d  y value (which m
2c800 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
2c810 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20  value as the.   
2c820 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20   ** largest key 
2c830 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a  on pPage)..    *
2c840 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64  *.    ** To find
2c850 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
2c860 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c   value on pPage,
2c870 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20   first find the 
2c880 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20  right-most .    
2c890 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2c8a0 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  . The first two 
2c8b0 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63  fields of this c
2c8c0 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20  ell are the .   
2c8d0 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74   ** record-lengt
2c8e0 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  h (a variable le
2c8f0 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20  ngth integer at 
2c900 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20  most 32-bits in 
2c910 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64  size).    ** and
2c920 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28   the key value (
2c930 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2c940 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68  h integer, may h
2c950 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a  ave any value)..
2c960 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
2c970 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e   of the while(..
2c980 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73  .) loops below s
2c990 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65  kips over the re
2c9a0 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20  cord-length.    
2c9b0 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65  ** field. The se
2c9c0 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20  cond while(...) 
2c9d0 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20  loop copies the 
2c9e0 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  key value from t
2c9f0 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  he.    ** cell o
2ca00 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65  n pPage into the
2ca10 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a   pSpace buffer..
2ca20 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c      */.    pCell
2ca30 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2ca40 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
2ca50 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20  1);.    pStop = 
2ca60 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
2ca70 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b  hile( (*(pCell++
2ca80 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
2ca90 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53  <pStop );.    pS
2caa0 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b  top = &pCell[9];
2cab0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28  .    while( ((*(
2cac0 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c  pOut++) = *(pCel
2cad0 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70  l++))&0x80) && p
2cae0 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20  Cell<pStop );.. 
2caf0 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
2cb00 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
2cb10 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  l into pParent. 
2cb20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c  */.    insertCel
2cb30 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65  l(pParent, pPare
2cb40 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63  nt->nCell, pSpac
2cb50 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53  e, (int)(pOut-pS
2cb60 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20  pace),.         
2cb70 20 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e        0, pPage->
2cb80 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20  pgno, &rc);..   
2cb90 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68   /* Set the righ
2cba0 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
2cbb0 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f  of pParent to po
2cbc0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
2cbd0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34  age. */.    put4
2cbe0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2cbf0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2cc00 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2cc10 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  New);.  .    /* 
2cc20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
2cc30 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
2cc40 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65   page. */.    re
2cc50 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
2cc60 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2cc70 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2cc80 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
2cc90 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  BALANCE */..#if 
2cca0 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  0./*.** This fun
2ccb0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
2ccc0 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69  ontribute anythi
2ccd0 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ng to the operat
2cce0 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a  ion of SQLite..*
2ccf0 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65  * it is sometime
2cd00 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70  s activated temp
2cd10 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65  orarily while de
2cd20 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73  bugging code res
2cd30 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72  ponsible .** for
2cd40 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72   setting pointer
2cd50 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  -map entries..*/
2cd60 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
2cd70 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d  apCheckPages(Mem
2cd80 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69  Page **apPage, i
2cd90 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
2cda0 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30   i, j;.  for(i=0
2cdb0 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  ; i<nPage; i++){
2cdc0 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20  .    Pgno n;.   
2cdd0 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61   u8 e;.    MemPa
2cde0 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61  ge *pPage = apPa
2cdf0 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61  ge[i];.    BtSha
2ce00 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2ce10 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
2ce20 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2ce30 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   );..    for(j=0
2ce40 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; j<pPage->nCell
2ce50 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65  ; j++){.      Ce
2ce60 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
2ce70 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a     u8 *z;.     .
2ce80 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65        z = findCe
2ce90 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20  ll(pPage, j);.  
2cea0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
2ceb0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20  llPtr(pPage, z, 
2cec0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  &info);.      if
2ced0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2cee0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2cef0 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
2cf00 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  (&z[info.iOverfl
2cf10 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74  ow]);.        pt
2cf20 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66  rmapGet(pBt, ovf
2cf30 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  l, &e, &n);.    
2cf40 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2cf50 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2cf60 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
2cf70 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1 );.      }.   
2cf80 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2cf90 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50  eaf ){.        P
2cfa0 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
2cfb0 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  byte(z);.       
2cfc0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2cfd0 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
2cfe0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cff0 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2d000 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
2d010 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  E );.      }.   
2d020 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67   }.    if( !pPag
2d030 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2d040 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
2d050 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2d060 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2d070 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20  ffset+8]);.     
2d080 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2d090 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
2d0a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2d0b0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2d0c0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
2d0d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2d0e0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2d0f0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
2d100 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2d110 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  o copy the conte
2d120 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65  nts of the b-tre
2d130 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a  e node stored .*
2d140 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20  * on page pFrom 
2d150 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  to page pTo. If 
2d160 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e  page pFrom was n
2d170 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  ot a leaf page, 
2d180 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  then.** the poin
2d190 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
2d1a0 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70  for each child p
2d1b0 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20  age are updated 
2d1c0 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  so that the.** p
2d1d0 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65  arent page store
2d1e0 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  d in the pointer
2d1f0 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f   map is page pTo
2d200 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61  . If pFrom conta
2d210 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c  ined.** any cell
2d220 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  s with overflow 
2d230 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74  page pointers, t
2d240 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hen the correspo
2d250 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a  nding pointer.**
2d260 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65   map entries are
2d270 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f   also updated so
2d280 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74   that the parent
2d290 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54   page is page pT
2d2a0 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  o..**.** If pFro
2d2b0 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63  m is currently c
2d2c0 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72  arrying any over
2d2d0 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72  flow cells (entr
2d2e0 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65  ies in the.** Me
2d2f0 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72  mPage.aOvfl[] ar
2d300 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e  ray), they are n
2d310 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f  ot copied to pTo
2d320 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  . .**.** Before 
2d330 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20  returning, page 
2d340 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c  pTo is reinitial
2d350 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65  ized using btree
2d360 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
2d370 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  * The performanc
2d380 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
2d390 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63  on is not critic
2d3a0 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  al. It is only u
2d3b0 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62  sed by .** the b
2d3c0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
2d3d0 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64  () and balance_d
2d3e0 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72  eeper() procedur
2d3f0 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a  es, neither of.*
2d400 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c  * which are call
2d410 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e  ed often under n
2d420 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e  ormal circumstan
2d430 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
2d440 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  oid copyNodeCont
2d450 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72  ent(MemPage *pFr
2d460 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  om, MemPage *pTo
2d470 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
2d480 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
2d490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68  E_OK ){.    BtSh
2d4a0 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74  ared * const pBt
2d4b0 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20   = pFrom->pBt;. 
2d4c0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46     u8 * const aF
2d4d0 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61  rom = pFrom->aDa
2d4e0 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  ta;.    u8 * con
2d4f0 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44  st aTo = pTo->aD
2d500 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  ata;.    int con
2d510 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46  st iFromHdr = pF
2d520 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  rom->hdrOffset;.
2d530 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54      int const iT
2d540 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67  oHdr = ((pTo->pg
2d550 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30  no==1) ? 100 : 0
2d560 29 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c 59 28  );.    TESTONLY(
2d570 69 6e 74 20 72 63 3b 29 0a 20 20 20 20 69 6e 74  int rc;).    int
2d580 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20   iData;.  .  .  
2d590 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2d5a0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61  >isInit );.    a
2d5b0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46  ssert( pFrom->nF
2d5c0 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20  ree>=iToHdr );. 
2d5d0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
2d5e0 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
2d5f0 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73  Hdr+5])<=pBt->us
2d600 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20  ableSize );.  . 
2d610 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62     /* Copy the b
2d620 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
2d630 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
2d640 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
2d650 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67  */.    iData = g
2d660 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
2d670 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20  FromHdr+5]);.   
2d680 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
2d690 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
2d6a0 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
2d6b0 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20  ize-iData);.    
2d6c0 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48  memcpy(&aTo[iToH
2d6d0 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f  dr], &aFrom[iFro
2d6e0 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65  mHdr], pFrom->ce
2d6f0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72  llOffset + 2*pFr
2d700 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20  om->nCell);.  . 
2d710 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69     /* Reinitiali
2d720 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
2d730 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
2d740 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
2d750 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a  structure.    **
2d760 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
2d770 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
2d780 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 22  ization of pTo "
2d790 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20 61 73  cannot" fail, as
2d7a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2d7b0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46 72   copied from pFr
2d7c0 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  om is known to b
2d7d0 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 20  e valid.  */.   
2d7e0 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30   pTo->isInit = 0
2d7f0 3b 0a 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 72  ;.    TESTONLY(r
2d800 63 20 3d 20 29 20 62 74 72 65 65 49 6e 69 74 50  c = ) btreeInitP
2d810 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 61 73  age(pTo);.    as
2d820 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2d830 5f 4f 4b 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  _OK );.  .    /*
2d840 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2d850 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2d860 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
2d870 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2d880 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61  ies.    ** for a
2d890 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65  ny b-tree or ove
2d8a0 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
2d8b0 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e   pTo now contain
2d8c0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74  s the pointers t
2d8d0 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
2d8e0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2d8f0 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73  {.      *pRC = s
2d900 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
2d910 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  To);.    }.  }.}
2d920 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2d930 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74  tine redistribut
2d940 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  es cells on the 
2d950 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63 68  iParentIdx'th ch
2d960 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a  ild of pParent.*
2d970 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74 68  * (hereafter "th
2d980 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70 20  e page") and up 
2d990 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f  to 2 siblings so
2d9a0 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
2d9b0 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a  have about the.*
2d9c0 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66  * same amount of
2d9d0 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73 75   free space. Usu
2d9e0 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69  ally a single si
2d9f0 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20  bling on either 
2da00 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70  side of the.** p
2da10 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e 20  age are used in 
2da20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
2da30 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69  hough both sibli
2da40 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
2da50 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20  rom one.** side 
2da60 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74  if the page is t
2da70 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74  he first or last
2da80 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61   child of its pa
2da90 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67  rent. If the pag
2daa0 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20  e .** has fewer 
2dab0 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20  than 2 siblings 
2dac0 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68  (something which
2dad0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
2dae0 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   if the page.** 
2daf0 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  is a root page o
2db00 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72  r a child of a r
2db10 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20 61  oot page) then a
2db20 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62  ll available sib
2db30 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69  lings.** partici
2db40 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
2db50 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ncing..**.** The
2db60 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
2db70 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  ngs of the page 
2db80 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
2db90 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
2dba0 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77  by .** one or tw
2dbb0 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74  o in an effort t
2dbc0 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61  o keep pages nea
2dbd0 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74  rly full but not
2dbe0 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a   over full. .**.
2dbf0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65  ** Note that whe
2dc00 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2dc10 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f  s called, some o
2dc20 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74  f the cells on t
2dc30 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74  he page.** might
2dc40 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65   not actually be
2dc50 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61   stored in MemPa
2dc60 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73  ge.aData[]. This
2dc70 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69   can happen.** i
2dc80 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76  f the page is ov
2dc90 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75  erfull. This rou
2dca0 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
2dcb0 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f  t all cells allo
2dcc0 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  cated.** to the 
2dcd0 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  page and its sib
2dce0 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d  lings fit into M
2dcf0 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62  emPage.aData[] b
2dd00 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2dd10 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
2dd20 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
2dd30 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69  g the page and i
2dd40 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c  ts siblings, cel
2dd50 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73  ls may be.** ins
2dd60 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65  erted into or re
2dd70 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
2dd80 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 72  arent page (pPar
2dd90 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a  ent). Doing so.*
2dda0 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  * may cause the 
2ddb0 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62  parent page to b
2ddc0 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
2ddd0 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20  r underfull. If 
2dde0 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c  this.** happens,
2ddf0 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
2de00 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
2de10 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b   caller to invok
2de20 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
2de30 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69   balancing routi
2de40 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20 70  ne to fix this p
2de50 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20  roblem (see the 
2de60 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e  balance() routin
2de70 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e). .**.** If th
2de80 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
2de90 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
2dea0 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
2deb0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
2dec0 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
2ded0 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73  tate. So if this
2dee0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20   routine fails, 
2def0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
2df00 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64  uld.** be rolled
2df10 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   back..**.** The
2df20 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
2df30 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2df40 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73  , aOvflSpace, is
2df50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a   a pointer to a.
2df60 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65 6e  ** buffer big en
2df70 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65  ough to hold one
2df80 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20   page. If while 
2df90 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20  inserting cells 
2dfa0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a  into the parent.
2dfb0 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  ** page (pParent
2dfc0 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  ) the parent pag
2dfd0 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75  e becomes overfu
2dfe0 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20  ll, this buffer 
2dff0 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  is.** used to st
2e000 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27 73  ore the parent's
2e010 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
2e020 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75   Because this fu
2e030 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a  nction inserts.*
2e040 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66  * a maximum of f
2e050 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c  our divider cell
2e060 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
2e070 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20  t page, and the 
2e080 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20  maximum.** size 
2e090 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64  of a cell stored
2e0a0 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72   within an inter
2e0b0 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61  nal node is alwa
2e0c0 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34  ys less than 1/4
2e0d0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d  .** of the page-
2e0e0 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53  size, the aOvflS
2e0f0 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73  pace[] buffer is
2e100 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2e110 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
2e120 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c  h for all overfl
2e130 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  ow cells..**.** 
2e140 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73  If aOvflSpace is
2e150 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70   set to a null p
2e160 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
2e170 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
2e180 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
2e190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2e1a0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20  lance_nonroot(. 
2e1b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
2e1c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2e1d0 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
2e1e0 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e  of siblings bein
2e1f0 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
2e200 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20  int iParentIdx, 
2e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e220 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65  /* Index of "the
2e230 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e   page" in pParen
2e240 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c  t */.  u8 *aOvfl
2e250 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
2e260 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73         /* page-s
2e270 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
2e280 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76  ce for parent ov
2e290 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  fl */.  int isRo
2e2a0 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ot              
2e2b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e2c0 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20  if pParent is a 
2e2d0 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a  root-page */.){.
2e2e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e300 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
2e310 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
2e320 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
2e330 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e340 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
2e350 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
2e360 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
2e370 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
2e380 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
2e390 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
2e3a0 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  om. */.  int nNe
2e3b0 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
2e3c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e3d0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
2e3e0 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  w[] */.  int nOl
2e3f0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2e400 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e410 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
2e420 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  d[] */.  int i, 
2e430 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
2e440 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2e450 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
2e460 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
2e470 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
2e480 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
2e490 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
2e4a0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  ] */.  int rc = 
2e4b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2e4c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
2e4d0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  n code */.  u16 
2e4e0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
2e4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
2e500 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
2e510 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
2e520 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
2e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e540 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
2e550 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
2e560 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
2e570 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
2e580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e590 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
2e5a0 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
2e5b0 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
2e5c0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2e5d0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
2e5e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
2e5f0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
2e600 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2e610 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
2e620 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
2e630 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
2e640 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
2e650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e660 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
2e670 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
2e680 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70  */.  int iOvflSp
2e690 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
2e6a0 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
2e6b0 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53  d byte of aOvflS
2e6c0 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pace[] */.  int 
2e6d0 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
2e6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2e6f0 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
2e700 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
2e710 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
2e720 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
2e730 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
2e740 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
2e750 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
2e760 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
2e770 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
2e780 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
2e790 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
2e7a0 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
2e7b0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
2e7c0 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
2e7d0 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
2e7e0 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52  cing */.  u8 *pR
2e7f0 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
2e800 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
2e810 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20  on in parent of 
2e820 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f  right-sibling po
2e830 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61  inter */.  u8 *a
2e840 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20  pDiv[NB-1];     
2e850 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
2e860 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
2e870 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
2e880 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
2e890 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
2e8a0 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
2e8b0 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
2e8c0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
2e8d0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
2e8e0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
2e8f0 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
2e900 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
2e910 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2e920 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
2e930 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
2e940 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
2e950 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
2e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e970 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
2e980 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
2e990 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
2e9a0 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20  *aSpace1;       
2e9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
2e9c0 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66  ce for copies of
2e9d0 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
2e9e0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
2e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea00 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f    /* Temp var to
2ea10 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75   store a page nu
2ea20 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42  mber in */..  pB
2ea30 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74  t = pParent->pBt
2ea40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2ea50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2ea60 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2ea70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2ea80 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2ea90 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
2eaa0 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52  ) );..#if 0.  TR
2eab0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
2eac0 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
2ead0 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
2eae0 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
2eaf0 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69  t->pgno));.#endi
2eb00 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  f..  /* At this 
2eb10 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61  point pParent ma
2eb20 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  y have at most o
2eb30 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ne overflow cell
2eb40 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68  . And if.  ** th
2eb50 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  is overflow cell
2eb60 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20   is present, it 
2eb70 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c  must be the cell
2eb80 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65   with .  ** inde
2eb90 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68  x iParentIdx. Th
2eba0 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65  is scenario come
2ebb0 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69  s about when thi
2ebc0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
2ebd0 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72  is called (indir
2ebe0 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69  ectly) from sqli
2ebf0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
2ec00 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2ec10 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2ec20 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  low==0 || pParen
2ec30 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  t->nOverflow==1 
2ec40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2ec50 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
2ec60 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61  =0 || pParent->a
2ec70 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61  Ovfl[0].idx==iPa
2ec80 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66  rentIdx );..  if
2ec90 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b  ( !aOvflSpace ){
2eca0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ecb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
2ecc0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62   /* Find the sib
2ecd0 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61  ling pages to ba
2ece0 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61  lance. Also loca
2ecf0 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  te the cells in 
2ed00 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68  pParent .  ** th
2ed10 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69  at divide the si
2ed20 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d  blings. An attem
2ed30 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
2ed40 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
2ed50 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73  n .  ** either s
2ed60 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f  ide of pPage. Mo
2ed70 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
2ed80 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
2ed90 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20  ide, however, . 
2eda0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
2edb0 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
2edc0 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
2edd0 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50  ther side. If pP
2ede0 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
2edf0 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
2ee00 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
2ee10 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
2ee20 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20   are taken.  .  
2ee30 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
2ee40 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65  p also drops the
2ee50 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
2ee60 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
2ee70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77  age. This.  ** w
2ee80 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ay, the remainde
2ee90 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  r of the functio
2eea0 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
2eeb0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
2eec0 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63  .  ** overflow c
2eed0 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65  ells in the pare
2eee0 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69  nt page, since i
2eef0 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68  f any existed th
2ef00 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76  ey will.  ** hav
2ef10 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
2ef20 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  emoved..  */.  i
2ef30 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65   = pParent->nOve
2ef40 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d  rflow + pParent-
2ef50 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c  >nCell;.  if( i<
2ef60 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  2 ){.    nxDiv =
2ef70 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69   0;.    nOld = i
2ef80 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  +1;.  }else{.   
2ef90 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69   nOld = 3;.    i
2efa0 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30  f( iParentIdx==0
2efb0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
2efc0 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76      .      nxDiv
2efd0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
2efe0 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
2eff0 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  i ){.      nxDiv
2f000 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73   = i-2;.    }els
2f010 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d  e{.      nxDiv =
2f020 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20   iParentIdx-1;. 
2f030 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a     }.    i = 2;.
2f040 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78 44    }.  if( (i+nxD
2f050 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
2f060 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d  rflow)==pParent-
2f070 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52  >nCell ){.    pR
2f080 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d  ight = &pParent-
2f090 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
2f0a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20  hdrOffset+8];.  
2f0b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68  }else{.    pRigh
2f0c0 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  t = findCell(pPa
2f0d0 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
2f0e0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2f0f0 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20  );.  }.  pgno = 
2f100 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29  get4byte(pRight)
2f110 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
2f120 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
2f130 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
2f140 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  o, &apOld[i]);. 
2f150 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2f160 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c     memset(apOld,
2f170 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66   0, (i+1)*sizeof
2f180 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
2f190 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2f1a0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
2f1b0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
2f1c0 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
2f1d0 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
2f1e0 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28  rflow;.    if( (
2f1f0 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  i--)==0 ) break;
2f200 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44 69  ..    if( i+nxDi
2f210 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  v==pParent->aOvf
2f220 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70 50 61 72  l[0].idx && pPar
2f230 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
2f240 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
2f250 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66   = pParent->aOvf
2f260 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20  l[0].pCell;.    
2f270 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2f280 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
2f290 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
2f2a0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
2f2b0 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  t, apDiv[i]);.  
2f2c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76      pParent->nOv
2f2d0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
2f2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44  }else{.      apD
2f2f0 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
2f300 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
2f310 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2f320 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e  flow);.      pgn
2f330 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
2f340 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
2f350 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
2f360 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
2f370 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20  Div[i]);..      
2f380 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c  /* Drop the cell
2f390 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
2f3a0 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20   page. apDiv[i] 
2f3b0 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a  still points to.
2f3c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c        ** the cel
2f3d0 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72  l within the par
2f3e0 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ent, even though
2f3f0 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f   it has been dro
2f400 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54  pped..      ** T
2f410 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
2f420 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63  use dropping a c
2f430 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69  ell only overwri
2f440 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20  tes the first.  
2f450 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
2f460 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69  s of it, and thi
2f470 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2f480 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72  not need the fir
2f490 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
2f4a0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69   bytes of the di
2f4b0 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74  vider cell. So t
2f4c0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61  he pointer is sa
2f4d0 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20  fe to use.      
2f4e0 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20  ** later on.  . 
2f4f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2f500 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69   Unless SQLite i
2f510 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65  s compiled in se
2f520 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
2f530 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2f540 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f        ** the dro
2f550 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20  pCell() routine 
2f560 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2f570 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77  he entire cell w
2f580 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20  ith zeroes..    
2f590 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2f5a0 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63  e, temporarily c
2f5b0 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74  opy the cell int
2f5c0 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  o the aOvflSpace
2f5d0 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66  [].      ** buff
2f5e0 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63  er. It will be c
2f5f0 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20  opied out again 
2f600 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61  as soon as the a
2f610 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20  Space[] buffer. 
2f620 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63       ** is alloc
2f630 61 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66  ated.  */.#ifdef
2f640 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
2f650 45 4c 45 54 45 0a 20 20 20 20 20 20 6d 65 6d 63  ELETE.      memc
2f660 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 61  py(&aOvflSpace[a
2f670 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d  pDiv[i]-pParent-
2f680 3e 61 44 61 74 61 5d 2c 20 61 70 44 69 76 5b 69  >aData], apDiv[i
2f690 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20  ], szNew[i]);.  
2f6a0 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26      apDiv[i] = &
2f6b0 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76  aOvflSpace[apDiv
2f6c0 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61  [i]-pParent->aDa
2f6d0 74 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ta];.#endif.    
2f6e0 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
2f6f0 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
2f700 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20  ent->nOverflow, 
2f710 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a  szNew[i], &rc);.
2f720 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2f730 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
2f740 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
2f750 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
2f760 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
2f770 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
2f780 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
2f790 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
2f7a0 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
2f7b0 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
2f7c0 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
2f7d0 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70   */.  k = pBt->p
2f7e0 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38  ageSize + ROUND8
2f7f0 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
2f800 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  );.  szScratch =
2f810 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
2f820 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
2f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f840 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
2f850 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
2f860 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f880 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
2f890 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
2f8a0 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
2f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8c0 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
2f8d0 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b  /.     + k*nOld;
2f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f900 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70       /* Page cop
2f910 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a  ies (apCopy) */.
2f920 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
2f930 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
2f940 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
2f950 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
2f960 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2f970 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
2f980 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2f990 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
2f9a0 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
2f9b0 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53  nMaxCells];.  aS
2f9c0 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a  pace1 = (u8*)&sz
2f9d0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
2f9e0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2f9f0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2fa00 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f  aSpace1) );..  /
2fa10 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
2fa20 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
2fa30 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
2fa40 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
2fa50 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
2fa60 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
2fa70 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
2fa80 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
2fa90 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
2faa0 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
2fab0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70  btained from aSp
2fac0 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
2fad0 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
2fae0 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
2faf0 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
2fb00 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
2fb10 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
2fb20 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
2fb30 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
2fb40 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
2fb50 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
2fb60 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
2fb70 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
2fb80 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
2fb90 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d  * into aSpace1[]
2fba0 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
2fbb0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
2fbc0 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75  ell[] are withou
2fbd0 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69  t.  ** child poi
2fbe0 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69  nters.  If sibli
2fbf0 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ngs are not leav
2fc00 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c  es, then all cel
2fc10 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c  l in.  ** apCell
2fc20 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64  [] include child
2fc30 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68   pointers.  Eith
2fc40 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  er way, all cell
2fc50 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20  s in apCell[].  
2fc60 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20  ** are alike..  
2fc70 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72  **.  ** leafCorr
2fc80 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50  ection:  4 if pP
2fc90 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
2fca0 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f  0 if pPage is no
2fcb0 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20  t a leaf..  **  
2fcc0 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20       leafData:  
2fcd0 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73  1 if pPage holds
2fce0 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50   key+data and pP
2fcf0 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79  arent holds only
2fd00 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65   keys..  */.  le
2fd10 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61  afCorrection = a
2fd20 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b  pOld[0]->leaf*4;
2fd30 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70  .  leafData = ap
2fd40 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b  Old[0]->hasData;
2fd50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
2fd60 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ld; i++){.    in
2fd70 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20  t limit;.    .  
2fd80 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
2fd90 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
2fda0 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   take a copy of 
2fdb0 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e 61  the i'th origina
2fdc0 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a  l sibling.    **
2fdd0 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   The rest of thi
2fde0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
2fdf0 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  use data from th
2fe00 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a  e copies rather.
2fe10 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20      ** that the 
2fe20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
2fe30 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
2fe40 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
2fe50 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  in the.    ** pr
2fe60 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f  ocess of being o
2fe70 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a  verwritten.  */.
2fe80 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
2fe90 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20  d = apCopy[i] = 
2fea0 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61 63  (MemPage*)&aSpac
2feb0 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e1[pBt->pageSize
2fec0 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d   + k*i];.    mem
2fed0 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b  cpy(pOld, apOld[
2fee0 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
2fef0 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e  ge));.    pOld->
2ff00 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  aData = (void*)&
2ff10 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d  pOld[1];.    mem
2ff20 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c  cpy(pOld->aData,
2ff30 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61   apOld[i]->aData
2ff40 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  , pBt->pageSize)
2ff50 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20 70  ;..    limit = p
2ff60 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
2ff70 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
2ff80 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
2ff90 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
2ffa0 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
2ffb0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
2ffc0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
2ffd0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
2ffe0 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
2fff0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
30000 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
30010 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
30020 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b  ;.      nCell++;
30030 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
30040 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66  <nOld-1 && !leaf
30050 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36  Data){.      u16
30060 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77   sz = (u16)szNew
30070 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  [i];.      u8 *p
30080 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  Temp;.      asse
30090 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
300a0 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43  lls );.      szC
300b0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
300c0 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
300d0 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d  aSpace1[iSpace1]
300e0 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20  ;.      iSpace1 
300f0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
30100 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
30110 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
30120 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65    assert( iSpace
30130 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1<=pBt->pageSize
30140 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
30150 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
30160 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43  , sz);.      apC
30170 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
30180 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
30190 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
301a0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
301b0 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63  =0 || leafCorrec
301c0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
301d0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
301e0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
301f0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
30200 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64  .      if( !pOld
30210 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
30220 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
30230 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
30240 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
30250 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  Old->hdrOffset==
30260 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
30270 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
30280 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
30290 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
302a0 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
302b0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
302c0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
302d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
302e0 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
302f0 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38  , &pOld->aData[8
30300 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ], 4);.      }el
30310 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
30320 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
30330 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
30340 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
30350 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
30360 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
30370 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
30380 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
30390 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
303a0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
303b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
303c0 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b    }.      nCell+
303d0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
303e0 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
303f0 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
30400 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
30410 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
30420 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
30430 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
30440 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
30450 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
30460 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
30470 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
30480 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
30490 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
304a0 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
304b0 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
304c0 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
304d0 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
304e0 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
304f0 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
30500 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
30510 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
30520 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
30530 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
30540 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
30550 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
30560 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
30570 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
30580 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
30590 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
305a0 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
305b0 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
305c0 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
305d0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
305e0 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
305f0 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
30600 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
30610 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
30620 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
30630 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
30640 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
30650 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
30660 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
30670 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
30680 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
30690 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
306a0 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
306b0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
306c0 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
306d0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
306e0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
306f0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
30700 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
30710 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
30720 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
30730 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
30740 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
30750 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
30760 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
30770 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
30780 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
30790 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
307a0 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
307b0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e  ++;.      if( k>
307c0 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c  NB+1 ){ rc = SQL
307d0 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 67 6f 74  ITE_CORRUPT; got
307e0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
307f0 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p; }.    }.  }. 
30800 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
30810 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b  otal;.  cntNew[k
30820 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b  ] = nCell;.  k++
30830 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65  ;..  /*.  ** The
30840 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65   packing compute
30850 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
30860 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65  s block is biase
30870 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62  d toward the sib
30880 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  lings.  ** on th
30890 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68  e left side.  Th
308a0 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20  e left siblings 
308b0 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c  are always nearl
308c0 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68  y full, while th
308d0 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  e.  ** right-mos
308e0 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  t sibling might 
308f0 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
30900 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20    This block of 
30910 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20  code attempts.  
30920 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  ** to adjust the
30930 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c   packing of sibl
30940 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65  ings to get a be
30950 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20  tter balance..  
30960 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a  **.  ** This adj
30970 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20  ustment is more 
30980 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61  than an optimiza
30990 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69  tion.  The packi
309a0 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20  ng above might. 
309b0 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66   ** be so out of
309c0 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62   balance as to b
309d0 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20  e illegal.  For 
309e0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67  example, the rig
309f0 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62  ht-most.  ** sib
30a00 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f  ling might be co
30a10 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20  mpletely empty. 
30a20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74   This adjustment
30a30 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c   is not optional
30a40 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b  ..  */.  for(i=k
30a50 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
30a60 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d     int szRight =
30a70 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53   szNew[i];  /* S
30a80 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
30a90 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20  n the right */. 
30aa0 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20     int szLeft = 
30ab0 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53  szNew[i-1]; /* S
30ac0 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f  ize of sibling o
30ad0 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20  n the left */.  
30ae0 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20    int r;        
30af0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
30b00 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c  f right-most cel
30b10 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e  l in left siblin
30b20 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20  g */.    int d; 
30b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30b40 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63  Index of first c
30b50 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ell to the left 
30b60 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67  of right sibling
30b70 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74   */..    r = cnt
30b80 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
30b90 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65    d = r + 1 - le
30ba0 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  afData;.    asse
30bb0 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( d<nMaxCells 
30bc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
30bd0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
30be0 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74    while( szRight
30bf0 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73  ==0 || szRight+s
30c00 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
30c10 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
30c20 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
30c30 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
30c40 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
30c50 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
30c60 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
30c70 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
30c80 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
30c90 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
30ca0 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
30cb0 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
30cc0 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
30cd0 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
30ce0 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
30cf0 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
30d00 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
30d10 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
30d20 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a   or pPage is.  *
30d30 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
30d40 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
30d50 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
30d60 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
30d70 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
30d80 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
30d90 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
30da0 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
30db0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  */.  assert( cnt
30dc0 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
30dd0 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
30de0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
30df0 3d 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  =0) );..  TRACE(
30e00 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
30e10 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20  %d %d %d  ",.   
30e20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c   apOld[0]->pgno,
30e30 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20   .    nOld>=2 ? 
30e40 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apOld[1]->pgno :
30e50 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20   0,.    nOld>=3 
30e60 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f  ? apOld[2]->pgno
30e70 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a   : 0.  ));..  /*
30e80 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b  .  ** Allocate k
30e90 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75   new pages.  Reu
30ea0 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65  se old pages whe
30eb0 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  re possible..  *
30ec0 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d  /.  if( apOld[0]
30ed0 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20  ->pgno<=1 ){.   
30ee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
30ef0 52 55 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62  RUPT;.    goto b
30f00 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
30f10 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20    }.  pageFlags 
30f20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74  = apOld[0]->aDat
30f30 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
30f40 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
30f50 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
30f60 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
30f70 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
30f80 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
30f90 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69  ];.      apOld[i
30fa0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  ] = 0;.      rc 
30fb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30fc0 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ite(pNew->pDbPag
30fd0 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  e);.      nNew++
30fe0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
30ff0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
31000 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65  eanup;.    }else
31010 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
31020 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  i>0 );.      rc 
31030 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
31040 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
31050 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b  &pgno, pgno, 0);
31060 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
31070 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
31080 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65  anup;.      apNe
31090 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  w[i] = pNew;.   
310a0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20     nNew++;..    
310b0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69    /* Set the poi
310c0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66  nter-map entry f
310d0 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  or the new sibli
310e0 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
310f0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
31100 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  UM ){.        pt
31110 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
31120 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
31130 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
31140 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
31150 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31170 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
31180 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
31190 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
311a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20  .  }..  /* Free 
311b0 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68  any old pages th
311c0 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73  at were not reus
311d0 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e  ed as new pages.
311e0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  .  */.  while( i
311f0 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65  <nOld ){.    fre
31200 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20  ePage(apOld[i], 
31210 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
31220 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
31230 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c  cleanup;.    rel
31240 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
31250 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ]);.    apOld[i]
31260 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20   = 0;.    i++;. 
31270 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75   }..  /*.  ** Pu
31280 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  t the new pages 
31290 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
312a0 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  er.  This helps 
312b0 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74  to.  ** keep ent
312c0 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ries in the disk
312d0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73   file in order s
312e0 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20  o that a scan.  
312f0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
31300 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  is a linear scan
31310 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
31320 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e  e.  That.  ** in
31330 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20   turn helps the 
31340 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
31350 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65   to deliver page
31360 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20  s.  ** from the 
31370 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c  disk more rapidl
31380 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  y..  **.  ** An 
31390 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e  O(n^2) insertion
313a0 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20   sort algorithm 
313b0 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e  is used, but sin
313c0 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76  ce.  ** n is nev
313d0 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20  er more than NB 
313e0 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e  (a small constan
313f0 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  t), that should.
31400 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72    ** not be a pr
31410 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  oblem..  **.  **
31420 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69   When NB==3, thi
31430 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69  s one optimizati
31440 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74  on makes the dat
31450 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74  abase.  ** about
31460 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20   25% faster for 
31470 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73  large insertions
31480 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a   and deletions..
31490 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
314a0 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<k-1; i++){.   
314b0 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65   int minV = apNe
314c0 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[i]->pgno;.    
314d0 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20  int minI = i;.  
314e0 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b    for(j=i+1; j<k
314f0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
31500 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f  ( apNew[j]->pgno
31510 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20  <(unsigned)minV 
31520 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20  ){.        minI 
31530 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e  = j;.        min
31540 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  V = apNew[j]->pg
31550 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
31560 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
31570 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
31580 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
31590 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 61 70  pT;.      t = ap
315a0 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[i]->pgno;.  
315b0 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
315c0 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
315d0 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
315e0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
315f0 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
31600 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77   }.  TRACE(("new
31610 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
31620 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
31630 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e  (%d)\n",.    apN
31640 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e  ew[0]->pgno, szN
31650 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
31660 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70  =2 ? apNew[1]->p
31670 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  gno : 0, nNew>=2
31680 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
31690 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61  .    nNew>=3 ? a
316a0 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[2]->pgno : 
316b0 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
316c0 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
316d0 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33  New>=4 ? apNew[3
316e0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
316f0 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
31700 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
31710 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e   ? apNew[4]->pgn
31720 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  o : 0, nNew>=5 ?
31730 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
31740 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
31750 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
31760 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
31770 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62  Page) );.  put4b
31780 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65  yte(pRight, apNe
31790 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
317a0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
317b0 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
317c0 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
317d0 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
317e0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
317f0 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
31800 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
31810 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
31820 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
31830 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
31840 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
31850 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
31860 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
31870 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
31880 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
31890 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
318a0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f  ells );.    zero
318b0 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
318c0 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
318d0 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
318e0 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
318f0 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
31900 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
31910 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
31920 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
31930 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
31940 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
31950 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
31960 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
31970 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
31980 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
31990 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
319a0 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
319b0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
319c0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
319d0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
319e0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
319f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
31a00 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c  sert( i<nNew-1 |
31a10 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  | j==nCell );.  
31a20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b    if( j<nCell ){
31a30 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
31a40 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
31a50 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
31a60 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
31a70 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
31a80 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
31a90 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
31aa0 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
31ab0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
31ac0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f       pTemp = &aO
31ad0 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70  vflSpace[iOvflSp
31ae0 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ace];.      if( 
31af0 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
31b00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
31b10 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
31b20 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
31b30 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
31b40 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
31b50 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
31b60 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
31b70 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
31b80 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
31b90 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
31ba0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
31bb0 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
31bc0 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
31bd0 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
31be0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
31bf0 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
31c00 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
31c10 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
31c20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
31c30 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
31c40 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
31c50 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
31c60 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
31c70 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
31c80 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72  j--;.        btr
31c90 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
31ca0 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
31cb0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
31cc0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
31cd0 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20         sz = 4 + 
31ce0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
31cf0 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b  [4], info.nKey);
31d00 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
31d10 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
31d20 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
31d30 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
31d40 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
31d50 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
31d60 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
31d70 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
31d80 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
31d90 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
31da0 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
31db0 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
31dc0 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
31dd0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
31de0 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
31df0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
31e00 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
31e10 28 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43  (see btreeParseC
31e20 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
31e30 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
31e40 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
31e50 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
31e60 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
31e70 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
31e80 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
31e90 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
31ea0 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
31eb0 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
31ec0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
31ed0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
31ee0 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
31ef0 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
31f00 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
31f10 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
31f20 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
31f30 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
31f40 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
31f50 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
31f60 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
31f70 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
31f80 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
31f90 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
31fa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
31fb0 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
31fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
31fd0 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
31fe0 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
31ff0 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
32000 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
32010 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
32020 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66      }.      iOvf
32030 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  lSpace += sz;.  
32040 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
32050 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
32060 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32070 20 69 4f 76 66 6c 53 70 61 63 65 3c 3d 70 42 74   iOvflSpace<=pBt
32080 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
32090 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
320a0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70  Parent, nxDiv, p
320b0 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c  Cell, sz, pTemp,
320c0 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63   pNew->pgno, &rc
320d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
320e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
320f0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
32100 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
32110 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32120 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
32130 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
32140 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
32150 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nxDiv++;.    }. 
32160 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d   }.  assert( j==
32170 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
32180 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61  t( nOld>0 );.  a
32190 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
321a0 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67  .  if( (pageFlag
321b0 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30  s & PTF_LEAF)==0
321c0 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69   ){.    u8 *zChi
321d0 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c  ld = &apCopy[nOl
321e0 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a  d-1]->aData[8];.
321f0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65      memcpy(&apNe
32200 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61  w[nNew-1]->aData
32210 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b  [8], zChild, 4);
32220 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f  .  }..  if( isRo
32230 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  ot && pParent->n
32240 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
32250 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61  nt->hdrOffset<=a
32260 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29  pNew[0]->nFree )
32270 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
32280 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
32290 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  tree now contain
322a0 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20  s no cells. The 
322b0 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20  only sibling.   
322c0 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 20   ** page is the 
322d0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
322e0 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20  he parent. Copy 
322f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
32300 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  the.    ** child
32310 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
32320 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e  arent, decreasin
32330 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65  g the overall he
32340 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20  ight of the.    
32350 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ** b-tree struct
32360 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73  ure by one. This
32370 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61 73   is described as
32380 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68   the "balance-sh
32390 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20  allower".    ** 
323a0 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e  sub-algorithm in
323b0 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74   some documentat
323c0 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ion..    **.    
323d0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  ** If this is an
323e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
323f0 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20  abase, the call 
32400 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  to copyNodeConte
32410 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74  nt() .    ** set
32420 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61  s all pointer-ma
32430 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  p entries corres
32440 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62  ponding to datab
32450 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73 20  ase image pages 
32460 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63  .    ** for whic
32470 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  h the pointer is
32480 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
32490 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
324a0 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a   copied..    **.
324b0 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
324c0 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76  d assert below v
324d0 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65  erifies that the
324e0 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 64   child page is d
324f0 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20  efragmented.    
32500 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20  ** (it must be, 
32510 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20 72  as it was just r
32520 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69  econstructed usi
32530 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  ng assemblePage(
32540 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  )). This.    ** 
32550 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20  is important if 
32560 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
32570 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61  happens to be pa
32580 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
32590 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67  base.    ** imag
325a0 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
325b0 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20  t( nNew==1 );.  
325c0 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b    assert( apNew[
325d0 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20  0]->nFree == .  
325e0 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65 28        (get2byte(
325f0 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61  &apNew[0]->aData
32600 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63  [5])-apNew[0]->c
32610 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b  ellOffset-apNew[
32620 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20  0]->nCell*2) .  
32630 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64    );.    copyNod
32640 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30  eContent(apNew[0
32650 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29  ], pParent, &rc)
32660 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61  ;.    freePage(a
32670 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20  pNew[0], &rc);. 
32680 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54   }else if( ISAUT
32690 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f  OVACUUM ){.    /
326a0 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65  * Fix the pointe
326b0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
326c0 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20  r all the cells 
326d0 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65  that were shifte
326e0 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a  d around. .    *
326f0 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65  * There are seve
32700 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79  ral different ty
32710 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  pes of pointer-m
32720 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ap entries that 
32730 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  need to.    ** b
32740 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
32750 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f  this routine. So
32760 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65  me of these have
32770 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64   been set alread
32780 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61  y, but.    ** ma
32790 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65  ny have not. The
327a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
327b0 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a  summary:.    **.
327c0 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20      **   1) The 
327d0 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
327e0 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c  ed with new sibl
327f0 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77  ing pages that w
32800 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20  ere not.    **  
32810 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65      siblings whe
32820 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32830 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73  was called. Thes
32840 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
32850 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20     **      been 
32860 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65  set. We don't ne
32870 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75  ed to worry abou
32880 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74  t old siblings t
32890 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20  hat were.    ** 
328a0 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68       moved to th
328b0 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68  e free-list - th
328c0 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64  e freePage() cod
328d0 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65  e has taken care
328e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20  .    **      of 
328f0 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  those..    **.  
32900 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f    **   2) The po
32910 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
32920 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
32930 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  h the first over
32940 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20  flow.    **     
32950 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65   page in any ove
32960 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65  rflow chains use
32970 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72  d by new divider
32980 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20   cells. These . 
32990 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20     **      have 
329a0 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65  also already bee
329b0 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20  n taken care of 
329c0 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
329d0 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  l() code..    **
329e0 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20  .    **   3) If 
329f0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
32a00 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
32a10 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
32a20 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a   pages of.    **
32a30 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72        cells stor
32a40 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e  ed on the siblin
32a50 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64  g pages may need
32a60 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
32a70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
32a80 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  4) If the siblin
32a90 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
32aa0 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
32ab0 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a  nodes, then any.
32ac0 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72      **      over
32ad0 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20  flow pages used 
32ae0 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d  by these cells m
32af0 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
32b00 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dated.    **    
32b10 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b    (internal intk
32b20 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63  ey nodes never c
32b30 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
32b40 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
32b50 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s)..    **.    *
32b60 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69  *   5) If the si
32b70 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
32b80 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
32b90 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
32ba0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74  .    **      ent
32bb0 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67  ries for the rig
32bc0 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f  ht-child pages o
32bd0 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d  f each sibling m
32be0 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20  ay need.    **  
32bf0 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65      to be update
32c00 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
32c10 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61   Cases 1 and 2 a
32c20 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62  re dealt with ab
32c30 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64  ove by other cod
32c40 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  e. The next.    
32c50 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  ** block deals w
32c60 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20  ith cases 3 and 
32c70 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66  4 and the one af
32c80 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35  ter that, case 5
32c90 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73  . Since.    ** s
32ca0 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  etting a pointer
32cb0 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20   map entry is a 
32cc0 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e  relatively expen
32cd0 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  sive operation, 
32ce0 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65  this.    ** code
32cf0 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74   only sets point
32d00 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
32d10 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  or child or over
32d20 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
32d30 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75  have.    ** actu
32d40 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65  ally moved betwe
32d50 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20  en pages.  */.  
32d60 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
32d70 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20  = apNew[0];.    
32d80 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
32d90 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69  apCopy[0];.    i
32da0 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  nt nOverflow = p
32db0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
32dc0 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64      int iNextOld
32dd0 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   = pOld->nCell +
32de0 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20   nOverflow;.    
32df0 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20  int iOverflow = 
32e00 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c  (nOverflow ? pOl
32e10 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20  d->aOvfl[0].idx 
32e20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30  : -1);.    j = 0
32e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32e50 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73   Current 'old' s
32e60 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
32e70 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20     k = 0;       
32e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e90 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
32ea0 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70   'new' sibling p
32eb0 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  age */.    for(i
32ec0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
32ed0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44  ){.      int isD
32ee0 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  ivider = 0;.    
32ef0 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78    while( i==iNex
32f00 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tOld ){.        
32f10 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
32f20 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
32f30 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
32f40 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64  last cell on old
32f50 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
32f60 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74  ing page j. If t
32f70 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
32f80 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
32f90 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
32fa0 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
32fb0 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61  hen cell i was a
32fc0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a   divider cell. *
32fd0 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d  /.        pOld =
32fe0 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20   apCopy[++j];.  
32ff0 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d        iNextOld =
33000 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
33010 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70   pOld->nCell + p
33020 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
33030 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64          if( pOld
33040 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
33050 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c           nOverfl
33060 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
33070 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  flow;.          
33080 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20  iOverflow = i + 
33090 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
330a0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a  ->aOvfl[0].idx;.
330b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
330c0 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c    isDivider = !l
330d0 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20  eafData;  .     
330e0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
330f0 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20  (nOverflow>0 || 
33100 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20  iOverflow<i );. 
33110 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
33120 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d  rflow<2 || pOld-
33130 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70  >aOvfl[0].idx==p
33140 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64  Old->aOvfl[1].id
33150 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x-1);.      asse
33160 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c  rt(nOverflow<3 |
33170 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d  | pOld->aOvfl[1]
33180 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66  .idx==pOld->aOvf
33190 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20  l[2].idx-1);.   
331a0 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66     if( i==iOverf
331b0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  low ){.        i
331c0 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20  sDivider = 1;.  
331d0 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76        if( (--nOv
331e0 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20  erflow)>0 ){.   
331f0 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77         iOverflow
33200 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
33210 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
33220 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b   i==cntNew[k] ){
33230 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
33240 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
33250 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
33260 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
33270 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20  ll on new.      
33280 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
33290 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e k. If the sibl
332a0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
332b0 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
332c0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
332d0 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
332e0 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72  l i is a divider
332f0 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   cell.  */.     
33300 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
33310 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  ++k];.        if
33320 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f  ( !leafData ) co
33330 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
33340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
33350 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73  nOld );.      as
33360 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a  sert( k<nNew );.
33370 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
33380 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e   cell was origin
33390 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c  ally divider cel
333a0 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f  l (and is not no
333b0 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  w) or.      ** a
333c0 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c  n overflow cell,
333d0 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20   or if the cell 
333e0 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61  was located on a
333f0 20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69   different sibli
33400 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  ng.      ** page
33410 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61   before the bala
33420 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  ncing, then the 
33430 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
33440 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ies associated. 
33450 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79       ** with any
33460 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c   child or overfl
33470 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ow pages need to
33480 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f   be updated.  */
33490 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76  .      if( isDiv
334a0 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67  ider || pOld->pg
334b0 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
334c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c  {.        if( !l
334d0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b  eafCorrection ){
334e0 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61  .          ptrma
334f0 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
33500 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50  te(apCell[i]), P
33510 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
33520 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  w->pgno, &rc);. 
33530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33540 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70   if( szCell[i]>p
33550 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b  New->minLocal ){
33560 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61  .          ptrma
33570 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
33580 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63  , apCell[i], &rc
33590 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
335a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
335b0 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74  if( !leafCorrect
335c0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ion ){.      for
335d0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
335e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20  +){.        u32 
335f0 6b 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26  key = get4byte(&
33600 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b  apNew[i]->aData[
33610 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  8]);.        ptr
33620 6d 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c  mapPut(pBt, key,
33630 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61   PTRMAP_BTREE, a
33640 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26  pNew[i]->pgno, &
33650 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
33660 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a   }..#if 0.    /*
33670 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b   The ptrmapCheck
33680 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73  Pages() contains
33690 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
336a0 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79  ents that verify
336b0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c   that.    ** all
336c0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
336d0 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65  es are set corre
336e0 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65  ctly. This is he
336f0 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20  lpful while .   
33700 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54   ** debugging. T
33710 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64  his is usually d
33720 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20  isabled because 
33730 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
33740 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61  se may.    ** ca
33750 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20  use an assert() 
33760 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69  statement to fai
33770 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61  l.  */.    ptrma
33780 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65  pCheckPages(apNe
33790 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74  w, nNew);.    pt
337a0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26  rmapCheckPages(&
337b0 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e  pParent, 1);.#en
337c0 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  dif.  }..  asser
337d0 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e  t( pParent->isIn
337e0 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  it );.  TRACE(("
337f0 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65  BALANCE: finishe
33800 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
33810 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
33820 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e          nOld, nN
33830 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20  ew, nCell));..  
33840 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20  /*.  ** Cleanup 
33850 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
33860 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63  ..  */.balance_c
33870 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
33880 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
33890 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
338a0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
338b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
338c0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
338d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
338e0 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
338f0 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
33900 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
33910 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
33920 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
33930 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72  alled when the r
33940 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
33950 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
33960 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68  s.** overfull (h
33970 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  as one or more o
33980 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a  verflow pages)..
33990 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c  **.** A new chil
339a0 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61  d page is alloca
339b0 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ted and the cont
339c0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72  ents of the curr
339d0 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ent root.** page
339e0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72  , including over
339f0 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20  flow cells, are 
33a00 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
33a10 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a  child. The root.
33a20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  ** page is then 
33a30 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d  overwritten to m
33a40 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20  ake it an empty 
33a50 70 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69  page with the ri
33a60 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f  ght-child .** po
33a70 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74  inter pointing t
33a80 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a  o the new page..
33a90 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
33aa0 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e  urning, all poin
33ab0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
33ac0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
33ad0 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20   pages .** that 
33ae0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61  the new child-pa
33af0 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  ge now contains 
33b00 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20  pointers to are 
33b10 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20  updated. The.** 
33b20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64  entry correspond
33b30 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72  ing to the new r
33b40 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
33b50 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a  er of the root.*
33b60 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75  * page is also u
33b70 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  pdated..**.** If
33b80 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70   successful, *pp
33b90 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20  Child is set to 
33ba0 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65  contain a refere
33bb0 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64  nce to the child
33bc0 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51   .** page and SQ
33bd0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
33be0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
33bf0 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  e the caller is 
33c00 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63  required.** to c
33c10 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
33c20 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78  ) on *ppChild ex
33c30 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61  actly once. If a
33c40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
33c50 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
33c60 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
33c70 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
33c80 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
33c90 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
33ca0 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f  per(MemPage *pRo
33cb0 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  ot, MemPage **pp
33cc0 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63  Child){.  int rc
33cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
33cf0 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75  rn value from su
33d00 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
33d10 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
33d20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33d30 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
33d40 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
33d50 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
33d60 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
33d70 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
33d80 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
33d90 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
33da0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f  hared *pBt = pRo
33db0 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54  ot->pBt;    /* T
33dc0 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61  he BTree */..  a
33dd0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f  ssert( pRoot->nO
33de0 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61  verflow>0 );.  a
33df0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
33e00 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
33e10 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  utex) );..  /* M
33e20 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72  ake pRoot, the r
33e30 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
33e40 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65  b-tree, writable
33e50 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  . Allocate a new
33e60 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74   .  ** page that
33e70 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
33e80 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64   new right-child
33e90 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20   of pPage. Copy 
33ea0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a  the contents.  *
33eb0 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74  * of the node st
33ec0 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e  ored on pRoot in
33ed0 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  to the new child
33ee0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   page..  */.  rc
33ef0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33f00 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
33f10 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
33f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33f30 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
33f40 72 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68  reePage(pBt,&pCh
33f50 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70  ild,&pgnoChild,p
33f60 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20  Root->pgno,0);. 
33f70 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65     copyNodeConte
33f80 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64  nt(pRoot, pChild
33f90 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
33fa0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
33fb0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
33fc0 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
33fd0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52  PTRMAP_BTREE, pR
33fe0 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  oot->pgno, &rc);
33ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
34000 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68   rc ){.    *ppCh
34010 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ild = 0;.    rel
34020 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
34030 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
34040 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
34050 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
34060 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
34070 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
34080 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
34090 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f  rIswriteable(pRo
340a0 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ot->pDbPage) );.
340b0 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
340c0 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e  ->nCell==pRoot->
340d0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43  nCell );..  TRAC
340e0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70  E(("BALANCE: cop
340f0 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25  y root %d into %
34100 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  d\n", pRoot->pgn
34110 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  o, pChild->pgno)
34120 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68  );..  /* Copy th
34130 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  e overflow cells
34140 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70   from pRoot to p
34150 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70  Child */.  memcp
34160 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c  y(pChild->aOvfl,
34170 20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70   pRoot->aOvfl, p
34180 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a  Root->nOverflow*
34190 73 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f  sizeof(pRoot->aO
341a0 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69  vfl[0]));.  pChi
341b0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ld->nOverflow = 
341c0 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pRoot->nOverflow
341d0 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
341e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f   contents of pRo
341f0 6f 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c  ot. Then install
34200 20 70 43 68 69 6c 64 20 61 73 20 74 68 65 20 72   pChild as the r
34210 69 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20  ight-child. */. 
34220 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c   zeroPage(pRoot,
34230 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30   pChild->aData[0
34240 5d 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a  ] & ~PTF_LEAF);.
34250 20 20 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f    put4byte(&pRoo
34260 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
34270 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
34280 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70  noChild);..  *pp
34290 43 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a  Child = pChild;.
342a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
342b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
342c0 20 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20   page that pCur 
342d0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
342e0 20 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65   to has just bee
342f0 6e 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a  n modified in.**
34300 20 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20   some way. This 
34310 66 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73  function figures
34320 20 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64   out if this mod
34330 69 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20  ification means 
34340 74 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64  the.** tree need
34350 73 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64  s to be balanced
34360 2c 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c  , and if so call
34370 73 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  s the appropriat
34380 65 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20  e balancing .** 
34390 72 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69  routine. Balanci
343a0 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a  ng routines are:
343b0 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  .**.**   balance
343c0 5f 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61  _quick().**   ba
343d0 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a  lance_deeper().*
343e0 2a 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  *   balance_nonr
343f0 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  oot().*/.static 
34400 69 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75  int balance(BtCu
34410 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
34420 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34430 4b 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  K;.  const int n
34440 4d 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d  Min = pCur->pBt-
34450 3e 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20  >usableSize * 2 
34460 2f 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e  / 3;.  u8 aBalan
34470 63 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d  ceQuickSpace[13]
34480 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20  ;.  u8 *pFree = 
34490 30 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20  0;..  TESTONLY( 
344a0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
344b0 6b 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a  k_called = 0 );.
344c0 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20    TESTONLY( int 
344d0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63  balance_deeper_c
344e0 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20  alled = 0 );..  
344f0 64 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61  do {.    int iPa
34500 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
34510 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
34520 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
34530 61 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20  age[iPage];..   
34540 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b   if( iPage==0 ){
34550 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
34560 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
34570 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
34580 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
34590 2d 74 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c  -tree is overful
345a0 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  l. In this case 
345b0 63 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20  call the.       
345c0 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70   ** balance_deep
345d0 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  er() function to
345e0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 63 68   create a new ch
345f0 69 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ild for the root
34600 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
34610 20 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75   and copy the cu
34620 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
34630 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  f the root-page 
34640 74 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20  to it. The.     
34650 20 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61     ** next itera
34660 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
34670 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65  oop will balance
34680 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e   the child page.
34690 0a 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20  .        */ .   
346a0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61       assert( (ba
346b0 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c  lance_deeper_cal
346c0 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20  led++)==0 );.   
346d0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
346e0 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c 20  e_deeper(pPage, 
346f0 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d  &pCur->apPage[1]
34700 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34710 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34720 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
34730 69 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20  iPage = 1;.     
34740 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
34750 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [0] = 0;.       
34760 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31     pCur->aiIdx[1
34770 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
34780 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
34790 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66  pPage[1]->nOverf
347a0 6c 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  low );.        }
347b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
347c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
347d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
347e0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
347f0 6c 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d  low==0 && pPage-
34800 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a  >nFree<=nMin ){.
34810 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
34820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65   }else{.      Me
34830 6d 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50  mPage * const pP
34840 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70  arent = pCur->ap
34850 50 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20  Page[iPage-1];. 
34860 20 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69       int const i
34870 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  Idx = pCur->aiId
34880 78 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20  x[iPage-1];..   
34890 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
348a0 61 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e  agerWrite(pParen
348b0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
348c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
348d0 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20  E_OK ){.#ifndef 
348e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
348f0 4b 42 41 4c 41 4e 43 45 0a 20 20 20 20 20 20 20  KBALANCE.       
34900 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
34910 61 74 61 0a 20 20 20 20 20 20 20 20 20 26 26 20  ata.         && 
34920 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
34930 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==1.         && 
34940 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
34950 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx==pPage->nCel
34960 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  l.         && pP
34970 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20  arent->pgno!=1. 
34980 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65          && pPare
34990 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a  nt->nCell==iIdx.
349a0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
349b0 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c       /* Call bal
349c0 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f 20  ance_quick() to 
349d0 63 72 65 61 74 65 20 61 20 6e 65 77 20 73 69 62  create a new sib
349e0 6c 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f 6e  ling of pPage on
349f0 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 20   which.         
34a00 20 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65   ** to store the
34a10 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20   overflow cell. 
34a20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
34a30 69 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63 65  inserts a new ce
34a40 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ll.          ** 
34a50 69 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77 68  into pParent, wh
34a60 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50  ich may cause pP
34a70 61 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20  arent overflow. 
34a80 49 66 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  If this.        
34a90 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68    ** happens, th
34aa0 65 20 6e 65 78 74 20 69 6e 74 65 72 61 74 69 6f  e next interatio
34ab0 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
34ac0 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50   will balance pP
34ad0 61 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 20  arent .         
34ae0 20 2a 2a 20 75 73 65 20 65 69 74 68 65 72 20 62   ** use either b
34af0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
34b00 20 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65 65 70   or balance_deep
34b10 65 72 28 29 2e 20 55 6e 74 69 6c 20 74 68 69 73  er(). Until this
34b20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
34b30 70 70 65 6e 73 2c 20 74 68 65 20 6f 76 65 72 66  ppens, the overf
34b40 6c 6f 77 20 63 65 6c 6c 20 69 73 20 73 74 6f 72  low cell is stor
34b50 65 64 20 69 6e 20 74 68 65 20 61 42 61 6c 61 6e  ed in the aBalan
34b60 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20  ceQuickSpace[]. 
34b70 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
34b80 65 72 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  er. .          *
34b90 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54  *.          ** T
34ba0 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
34bb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
34bc0 72 74 28 29 20 69 73 20 74 6f 20 63 68 65 63 6b  rt() is to check
34bd0 20 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20   that only a.   
34be0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
34bf0 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
34c00 5f 71 75 69 63 6b 28 29 20 69 73 20 6d 61 64 65  _quick() is made
34c10 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74   for each call t
34c20 6f 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  o this.         
34c30 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66   ** function. If
34c40 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20 76   this were not v
34c50 65 72 69 66 69 65 64 2c 20 61 20 73 75 62 74 6c  erified, a subtl
34c60 65 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20  e bug involving 
34c70 72 65 75 73 65 0a 20 20 20 20 20 20 20 20 20 20  reuse.          
34c80 2a 2a 20 6f 66 20 74 68 65 20 61 42 61 6c 61 6e  ** of the aBalan
34c90 63 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d  ceQuickSpace[] m
34ca0 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20  ight sneak in.. 
34cb0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
34cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62        assert( (b
34cd0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c  alance_quick_cal
34ce0 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20  led++)==0 );.   
34cf0 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
34d00 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 72 65 6e  nce_quick(pParen
34d10 74 2c 20 70 50 61 67 65 2c 20 61 42 61 6c 61 6e  t, pPage, aBalan
34d20 63 65 51 75 69 63 6b 53 70 61 63 65 29 3b 0a 20  ceQuickSpace);. 
34d30 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
34d40 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  dif.        {.  
34d50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
34d60 69 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62 61  is case, call ba
34d70 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
34d80 74 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20  to redistribute 
34d90 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20  cells.          
34da0 2a 2a 20 62 65 74 77 65 65 6e 20 70 50 61 67 65  ** between pPage
34db0 20 61 6e 64 20 75 70 20 74 6f 20 32 20 6f 66 20   and up to 2 of 
34dc0 69 74 73 20 73 69 62 6c 69 6e 67 20 70 61 67 65  its sibling page
34dd0 73 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  s. This involves
34de0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  .          ** mo
34df0 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
34e00 65 6e 74 73 20 6f 66 20 70 50 61 72 65 6e 74 2c  ents of pParent,
34e10 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65   which may cause
34e20 20 70 50 61 72 65 6e 74 20 74 6f 0a 20 20 20 20   pParent to.    
34e30 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20        ** become 
34e40 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
34e50 72 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20  rfull. The next 
34e60 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
34e70 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20   do-loop.       
34e80 20 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e     ** will balan
34e90 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
34ea0 67 65 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68  ge to correct th
34eb0 69 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  is..          **
34ec0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49   .          ** I
34ed0 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
34ee0 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75  e becomes overfu
34ef0 6c 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ll, the overflow
34f00 20 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20   cell or cells. 
34f10 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20           ** are 
34f20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 53  stored in the pS
34f30 70 61 63 65 20 62 75 66 66 65 72 20 61 6c 6c 6f  pace buffer allo
34f40 63 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  cated immediatel
34f50 79 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20  y below. .      
34f60 20 20 20 20 2a 2a 20 41 20 73 75 62 73 65 71 75      ** A subsequ
34f70 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ent iteration of
34f80 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c   the do-loop wil
34f90 6c 20 64 65 61 6c 20 77 69 74 68 20 74 68 69 73  l deal with this
34fa0 20 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   by.          **
34fb0 20 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65   calling balance
34fc0 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61  _nonroot() (bala
34fd0 6e 63 65 5f 64 65 65 70 65 72 28 29 20 6d 61 79  nce_deeper() may
34fe0 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
34ff0 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  ,.          ** b
35000 75 74 20 69 74 20 64 6f 65 73 6e 27 74 20 64 65  ut it doesn't de
35010 61 6c 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77  al with overflow
35020 20 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f   cells - just mo
35030 76 65 73 20 74 68 65 6d 20 74 6f 20 61 0a 20 20  ves them to a.  
35040 20 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65          ** diffe
35050 72 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63 65  rent page). Once
35060 20 74 68 69 73 20 73 75 62 73 65 71 75 65 6e 74   this subsequent
35070 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65   call to balance
35080 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20  _nonroot() .    
35090 20 20 20 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d        ** has com
350a0 70 6c 65 74 65 64 2c 20 69 74 20 69 73 20 73 61  pleted, it is sa
350b0 66 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  fe to release th
350c0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
350d0 75 73 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  used by.        
350e0 20 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75    ** the previou
350f0 73 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f  s call, as the o
35100 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74  verflow cell dat
35110 61 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e  a will have been
35120 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
35130 6f 70 69 65 64 20 65 69 74 68 65 72 20 69 6e 74  opied either int
35140 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20  o the body of a 
35150 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6f 72  database page or
35160 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
35170 20 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61 63          ** pSpac
35180 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
35190 74 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  to the latter ca
351a0 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f  ll to balance_no
351b0 6e 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20 20  nroot()..       
351c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
351d0 75 38 20 2a 70 53 70 61 63 65 20 3d 20 73 71 6c  u8 *pSpace = sql
351e0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
351f0 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  Cur->pBt->pageSi
35200 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ze);.          r
35210 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  c = balance_nonr
35220 6f 6f 74 28 70 50 61 72 65 6e 74 2c 20 69 49 64  oot(pParent, iId
35230 78 2c 20 70 53 70 61 63 65 2c 20 69 50 61 67 65  x, pSpace, iPage
35240 3d 3d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==1);.          
35250 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
35260 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
35270 46 72 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Free is not NULL
35280 2c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  , it points to t
35290 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
352a0 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 20   used .         
352b0 20 20 20 2a 2a 20 62 79 20 61 20 70 72 65 76 69     ** by a previ
352c0 6f 75 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ous call to bala
352d0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49  nce_nonroot(). I
352e0 74 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a  ts contents are.
352f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
35300 6f 77 20 73 74 6f 72 65 64 20 65 69 74 68 65 72  ow stored either
35310 20 6f 6e 20 72 65 61 6c 20 64 61 74 61 62 61 73   on real databas
35320 65 20 70 61 67 65 73 20 6f 72 20 77 69 74 68 69  e pages or withi
35330 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  n the .         
35340 20 20 20 2a 2a 20 6e 65 77 20 70 53 70 61 63 65     ** new pSpace
35350 20 62 75 66 66 65 72 2c 20 73 6f 20 69 74 20 6d   buffer, so it m
35360 61 79 20 62 65 20 73 61 66 65 6c 79 20 66 72 65  ay be safely fre
35370 65 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  ed here. */.    
35380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35390 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a  ageFree(pFree);.
353a0 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
353b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53         /* The pS
353c0 70 61 63 65 20 62 75 66 66 65 72 20 77 69 6c 6c  pace buffer will
353d0 20 62 65 20 66 72 65 65 64 20 61 66 74 65 72 20   be freed after 
353e0 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
353f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 61  .          ** ba
35400 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c  lance_nonroot(),
35410 20 6f 72 20 6a 75 73 74 20 62 65 66 6f 72 65 20   or just before 
35420 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
35430 74 75 72 6e 73 2c 20 77 68 69 63 68 65 76 65 72  turns, whichever
35440 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
35450 6d 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20  mes first. */.  
35460 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20          pFree = 
35470 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20  pSpace;.        
35480 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
35490 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
354a0 77 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  w = 0;..      /*
354b0 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   The next iterat
354c0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
354d0 6f 70 20 62 61 6c 61 6e 63 65 73 20 74 68 65 20  op balances the 
354e0 70 61 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a  parent page. */.
354f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
35500 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
35510 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
35520 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72     }.  }while( r
35530 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
35540 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
35550 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
35560 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a  ree(pFree);.  }.
35570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
35580 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
35590 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
355a0 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20  the BTree.  The 
355b0 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20  key is given by 
355c0 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61  (pKey,nKey).** a
355d0 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67  nd the data is g
355e0 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e  iven by (pData,n
355f0 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73  Data).  The curs
35600 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  or is used only 
35610 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61  to.** define wha
35620 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f  t table the reco
35630 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73  rd should be ins
35640 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65  erted into.  The
35650 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65   cursor.** is le
35660 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
35670 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e   random location
35680 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49  ..**.** For an I
35690 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c  NTKEY table, onl
356a0 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65  y the nKey value
356b0 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75   of the key is u
356c0 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a  sed.  pKey is.**
356d0 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61   ignored.  For a
356e0 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c   ZERODATA table,
356f0 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e   the pData and n
35700 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67  Data are both ig
35710 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
35720 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70  the seekResult p
35730 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
35740 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 75 63  zero, then a suc
35750 63 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a  cessful call to.
35760 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  ** MovetoUnpacke
35770 64 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72 73  d() to seek curs
35780 6f 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65 79  or pCur to (pKey
35790 2c 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72 65  , nKey) has alre
357a0 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66  ady.** been perf
357b0 6f 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75 6c  ormed. seekResul
357c0 74 20 69 73 20 74 68 65 20 73 65 61 72 63 68 20  t is the search 
357d0 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
357e0 28 61 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e  (a negative.** n
357f0 75 6d 62 65 72 20 69 66 20 70 43 75 72 20 70 6f  umber if pCur po
35800 69 6e 74 73 20 61 74 20 61 6e 20 65 6e 74 72 79  ints at an entry
35810 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72   that is smaller
35820 20 74 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65   than (pKey, nKe
35830 79 29 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69  y), or.** a posi
35840 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 70 43  tive value if pC
35850 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
35860 65 74 72 79 20 74 68 61 74 20 69 73 20 6c 61 72  etry that is lar
35870 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b  ger than .** (pK
35880 65 79 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a  ey, nKey)). .**.
35890 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  ** If the seekRe
358a0 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
358b0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
358c0 20 74 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   the caller guar
358d0 61 6e 74 65 65 73 20 74 68 61 74 0a 2a 2a 20 63  antees that.** c
358e0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
358f0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 65 78  inting at the ex
35900 69 73 74 69 6e 67 20 63 6f 70 79 20 6f 66 20 61  isting copy of a
35910 20 72 6f 77 20 74 68 61 74 20 69 73 20 74 6f 20   row that is to 
35920 62 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74 65  be.** overwritte
35930 6e 2e 20 20 49 66 20 74 68 65 20 73 65 65 6b 52  n.  If the seekR
35940 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20  esult parameter 
35950 69 73 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f  is 0, then curso
35960 72 20 70 43 75 72 20 6d 61 79 0a 2a 2a 20 70 6f  r pCur may.** po
35970 69 6e 74 20 74 6f 20 61 6e 79 20 65 6e 74 72 79  int to any entry
35980 20 6f 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20   or to no entry 
35990 61 74 20 61 6c 6c 20 61 6e 64 20 73 6f 20 74 68  at all and so th
359a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
359b0 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63  to seek.** the c
359c0 75 72 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65  ursor before the
359d0 20 6e 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20   new key can be 
359e0 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74  inserted..*/.int
359f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
35a00 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ert(.  BtCursor 
35a10 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
35a20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20        /* Insert 
35a30 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61  data into the ta
35a40 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73  ble of this curs
35a50 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  or */.  const vo
35a60 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
35a70 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
35a80 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  y of the new rec
35a90 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
35aa0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
35ab0 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64  nData,  /* The d
35ac0 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72  ata of the new r
35ad0 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ecord */.  int n
35ae0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
35af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
35b00 62 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62  ber of extra 0 b
35b10 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
35b20 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  o data */.  int 
35b30 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20  appendBias,     
35b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
35b50 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69  ue if this is li
35b60 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a  kely an append *
35b70 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75  /.  int seekResu
35b80 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  lt              
35b90 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
35ba0 70 72 69 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61  prior MovetoUnpa
35bb0 63 6b 65 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29  cked() call */.)
35bc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
35bd0 74 20 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75  t loc = seekResu
35be0 6c 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  lt;          /* 
35bf0 2d 31 3a 20 62 65 66 6f 72 65 20 64 65 73 69 72  -1: before desir
35c00 65 64 20 6c 6f 63 61 74 69 6f 6e 20 20 2b 31 3a  ed location  +1:
35c10 20 61 66 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20   after */.  int 
35c20 73 7a 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74  szNew = 0;.  int
35c30 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
35c40 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20  *pPage;.  Btree 
35c50 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
35c60 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
35c70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75  Bt = p->pBt;.  u
35c80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c  nsigned char *ol
35c90 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65  dCell;.  unsigne
35ca0 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20  d char *newCell 
35cb0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  = 0;..  if( pCur
35cc0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
35cd0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 61 73  _FAULT ){.    as
35ce0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
35cf0 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
35d00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  );.    return pC
35d10 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
35d20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  }..  assert( cur
35d30 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
35d40 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
35d50 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
35d60 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
35d70 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
35d80 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e   && !pBt->readOn
35d90 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ly );.  assert( 
35da0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
35db0 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d  bleLock(p, pCur-
35dc0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d  >pgnoRoot, pCur-
35dd0 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29  >pKeyInfo!=0, 2)
35de0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
35df0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
35e00 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 69 73   has been consis
35e10 74 65 6e 74 2e 20 49 66 20 74 68 69 73 20 63 75  tent. If this cu
35e20 72 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 0a  rsor was opened.
35e30 20 20 2a 2a 20 65 78 70 65 63 74 69 6e 67 20 61    ** expecting a
35e40 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20  n index b-tree, 
35e50 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
35e60 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
35e70 69 6e 67 20 62 6c 6f 62 0a 20 20 2a 2a 20 6b 65  ing blob.  ** ke
35e80 79 73 20 77 69 74 68 20 6e 6f 20 61 73 73 6f 63  ys with no assoc
35e90 69 61 74 65 64 20 64 61 74 61 2e 20 49 66 20 74  iated data. If t
35ea0 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
35eb0 65 6e 65 64 20 65 78 70 65 63 74 69 6e 67 20 61  ened expecting a
35ec0 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65 79 20 74 61  n.  ** intkey ta
35ed0 62 6c 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ble, the caller 
35ee0 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
35ef0 69 6e 67 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ing integer keys
35f00 20 77 69 74 68 20 61 0a 20 20 2a 2a 20 62 6c 6f   with a.  ** blo
35f10 62 20 6f 66 20 61 73 73 6f 63 69 61 74 65 64 20  b of associated 
35f20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 61 73 73 65  data.  */.  asse
35f30 72 74 28 20 28 70 4b 65 79 3d 3d 30 29 3d 3d 28  rt( (pKey==0)==(
35f40 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
35f50 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
35f60 68 69 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74  his is an insert
35f70 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d   into a table b-
35f80 74 72 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65  tree, invalidate
35f90 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20   any incrblob . 
35fa0 20 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   ** cursors open
35fb0 20 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e   on the row bein
35fc0 67 20 72 65 70 6c 61 63 65 64 20 28 61 73 73 75  g replaced (assu
35fd0 6d 69 6e 67 20 74 68 69 73 20 69 73 20 61 20 72  ming this is a r
35fe0 65 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72  eplace.  ** oper
35ff0 61 74 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73  ation - if it is
36000 20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77   not, the follow
36010 69 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e  ing is a no-op).
36020 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d    */.  if( pCur-
36030 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a  >pKeyInfo==0 ){.
36040 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e      invalidateIn
36050 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c  crblobCursors(p,
36060 20 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a   nKey, 0);.  }..
36070 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
36080 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
36090 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
360a0 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e  n on this table.
360b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f  .  **.  ** In so
360c0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 63 61  me cases, the ca
360d0 6c 6c 20 74 6f 20 62 74 72 65 65 4d 6f 76 65 74  ll to btreeMovet
360e0 6f 28 29 20 62 65 6c 6f 77 20 69 73 20 61 20 6e  o() below is a n
360f0 6f 2d 6f 70 2e 20 46 6f 72 0a 20 20 2a 2a 20 65  o-op. For.  ** e
36100 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 69 6e 73  xample, when ins
36110 65 72 74 69 6e 67 20 64 61 74 61 20 69 6e 74 6f  erting data into
36120 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 75   a table with au
36130 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 69 6e 74  to-generated int
36140 65 67 65 72 0a 20 20 2a 2a 20 6b 65 79 73 2c 20  eger.  ** keys, 
36150 74 68 65 20 56 44 42 45 20 6c 61 79 65 72 20 69  the VDBE layer i
36160 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 42 74  nvokes sqlite3Bt
36170 72 65 65 4c 61 73 74 28 29 20 74 6f 20 66 69 67  reeLast() to fig
36180 75 72 65 20 6f 75 74 20 74 68 65 20 0a 20 20 2a  ure out the .  *
36190 2a 20 69 6e 74 65 67 65 72 20 6b 65 79 20 74 6f  * integer key to
361a0 20 75 73 65 2e 20 49 74 20 74 68 65 6e 20 63 61   use. It then ca
361b0 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
361c0 6e 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 69 6e  n to actually in
361d0 73 65 72 74 20 74 68 65 20 0a 20 20 2a 2a 20 64  sert the .  ** d
361e0 61 74 61 20 69 6e 74 6f 20 74 68 65 20 69 6e 74  ata into the int
361f0 6b 65 79 20 42 2d 54 72 65 65 2e 20 49 6e 20 74  key B-Tree. In t
36200 68 69 73 20 63 61 73 65 20 62 74 72 65 65 4d 6f  his case btreeMo
36210 76 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65  veto() recognize
36220 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  s.  ** that the 
36230 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
36240 79 20 77 68 65 72 65 20 69 74 20 6e 65 65 64 73  y where it needs
36250 20 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72   to be and retur
36260 6e 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  ns without.  ** 
36270 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20  doing any work. 
36280 54 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74 69  To avoid thwarti
36290 6e 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a  ng these optimiz
362a0 61 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d  ations, it is im
362b0 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74  portant.  ** not
362c0 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75   to clear the cu
362d0 72 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a  rsor here..  */.
362e0 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
362f0 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
36300 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
36310 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
36320 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 21 6c  urn rc;.  if( !l
36330 6f 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  oc ){.    rc = b
36340 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
36350 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
36360 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 3b 0a  endBias, &loc);.
36370 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
36380 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
36390 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
363a0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
363b0 20 7c 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74   || (pCur->eStat
363c0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
363d0 44 20 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20  D && loc) );..  
363e0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
363f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
36400 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
36410 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b  ge->intKey || nK
36420 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
36430 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c  t( pPage->leaf |
36440 7c 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | !pPage->intKey
36450 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 49   );..  TRACE(("I
36460 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25 64 20  NSERT: table=%d 
36470 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d  nkey=%lld ndata=
36480 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c 6e 22  %d page=%d %s\n"
36490 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ,.          pCur
364a0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79  ->pgnoRoot, nKey
364b0 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65 2d 3e  , nData, pPage->
364c0 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
364d0 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72  loc==0 ? "overwr
364e0 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e 74 72  ite" : "new entr
364f0 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  y"));.  assert( 
36500 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
36510 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  .  allocateTempS
36520 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e 65 77  pace(pBt);.  new
36530 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70  Cell = pBt->pTmp
36540 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e 65 77  Space;.  if( new
36550 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
36560 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
36570 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c   rc = fillInCell
36580 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c  (pPage, newCell,
36590 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61   pKey, nKey, pDa
365a0 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f  ta, nData, nZero
365b0 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28  , &szNew);.  if(
365c0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
365d0 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28  nsert;.  assert(
365e0 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65   szNew==cellSize
365f0 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77 43 65  Ptr(pPage, newCe
36600 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
36610 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f   szNew<=MX_CELL_
36620 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 69  SIZE(pBt) );.  i
36630 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
36640 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
36650 20 69 66 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20   if( loc==0 ){. 
36660 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20     u16 szOld;.  
36670 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 50    assert( idx<pP
36680 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
36690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
366a0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
366b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
366c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  ( rc ){.      go
366d0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
366e0 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c     }.    oldCell
366f0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
36700 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 69 66 28  e, idx);.    if(
36710 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
36720 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65  .      memcpy(ne
36730 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20  wCell, oldCell, 
36740 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  4);.    }.    sz
36750 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  Old = cellSizePt
36760 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  r(pPage, oldCell
36770 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  );.    rc = clea
36780 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64  rCell(pPage, old
36790 43 65 6c 6c 29 3b 0a 20 20 20 20 64 72 6f 70 43  Cell);.    dropC
367a0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
367b0 73 7a 4f 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20  szOld, &rc);.   
367c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
367d0 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 7d 65 6c  nd_insert;.  }el
367e0 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20  se if( loc<0 && 
367f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
36800 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
36810 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  age->leaf );.   
36820 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
36830 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
36840 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
36850 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
36860 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 69 6e 73  eaf );.  }.  ins
36870 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ertCell(pPage, i
36880 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e  dx, newCell, szN
36890 65 77 2c 20 30 2c 20 30 2c 20 26 72 63 29 3b 0a  ew, 0, 0, &rc);.
368a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
368b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
368c0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61  ->nCell>0 || pPa
368d0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
368e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65  );..  /* If no e
368f0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
36900 20 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61   and pPage has a
36910 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c  n overflow cell,
36920 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20   call balance() 
36930 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72  .  ** to redistr
36940 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ibute the cells 
36950 77 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e  within the tree.
36960 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29   Since balance()
36970 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74   may move.  ** t
36980 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20  he cursor, zero 
36990 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  the BtCursor.inf
369a0 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75  o.nSize and BtCu
369b0 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20  rsor.validNKey. 
369c0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20   ** variables.. 
369d0 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75   **.  ** Previou
369e0 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  s versions of SQ
369f0 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65  Lite called move
36a00 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65  ToRoot() to move
36a10 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a   the cursor.  **
36a20 20 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f   back to the roo
36a30 74 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63  t page as balanc
36a40 65 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61  e() used to inva
36a50 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65  lidate the conte
36a60 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75  nts.  ** of BtCu
36a70 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e  rsor.apPage[] an
36a80 64 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  d BtCursor.aiIdx
36a90 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  []. Instead of d
36aa0 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20  oing that,.  ** 
36ab0 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73  set the cursor s
36ac0 74 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64  tate to "invalid
36ad0 22 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f  ". This makes co
36ae0 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72  mmon insert oper
36af0 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67  ations.  ** slig
36b00 68 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a  htly faster..  *
36b10 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20  *.  ** There is 
36b20 61 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70  a subtle but imp
36b30 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ortant optimizat
36b40 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68  ion here too. Wh
36b50 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a  en inserting.  *
36b60 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72  * multiple recor
36b70 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65  ds into an intke
36b80 79 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61  y b-tree using a
36b90 20 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28   single cursor (
36ba0 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70  as can.  ** happ
36bb0 65 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  en while process
36bc0 69 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49  ing an "INSERT I
36bd0 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20  NTO ... SELECT" 
36be0 73 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20  statement), it. 
36bf0 20 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65   ** is advantage
36c00 6f 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65  ous to leave the
36c10 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
36c20 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
36c30 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62  ry in.  ** the b
36c40 2d 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c  -tree if possibl
36c50 65 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  e. If the cursor
36c60 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
36c70 67 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20  g to the last.  
36c80 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
36c90 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e  table, and the n
36ca0 65 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64  ext row inserted
36cb0 20 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20   has an integer 
36cc0 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20  key.  ** larger 
36cd0 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
36ce0 20 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69   existing key, i
36cf0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
36d00 20 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a   insert the.  **
36d10 20 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65   row without see
36d20 6b 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e  king the cursor.
36d30 20 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62   This can be a b
36d40 69 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ig performance b
36d50 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75  oost..  */.  pCu
36d60 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
36d70 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
36d80 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
36d90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36da0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
36db0 77 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61  w ){.    rc = ba
36dc0 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20  lance(pCur);..  
36dd0 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73    /* Must make s
36de0 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ure nOverflow is
36df0 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65   reset to zero e
36e00 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e  ven if the balan
36e10 63 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c  ce().    ** fail
36e20 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61  s. Internal data
36e30 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
36e40 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ption will resul
36e50 74 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20  t otherwise. .  
36e60 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74    ** Also, set t
36e70 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
36e80 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73  to invalid. This
36e90 20 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f   stops saveCurso
36ea0 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20  rPosition().    
36eb0 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
36ec0 6f 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65  o save the curre
36ed0 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  nt position of t
36ee0 68 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20  he cursor.  */. 
36ef0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
36f00 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f  pCur->iPage]->nO
36f10 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
36f20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
36f30 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
36f40 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
36f50 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
36f60 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c  >iPage]->nOverfl
36f70 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e  ow==0 );..end_in
36f80 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  sert:.  return r
36f90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
36fa0 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
36fb0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
36fc0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
36fd0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
36fe0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
36ff0 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61  a arbitrary loca
37000 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
37010 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
37020 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
37030 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
37040 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
37050 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
37060 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
37070 20 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20     .  int rc;   
37080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
370a0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
370b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
370c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370d0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64      /* Page to d
370e0 65 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20  elete cell from 
370f0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
37100 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  ar *pCell;      
37110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
37120 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20  nter to cell to 
37130 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
37140 69 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20  iCellIdx;       
37150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37160 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c   /* Index of cel
37170 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
37180 20 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b   int iCellDepth;
37190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371a0 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f        /* Depth o
371b0 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e  f node containin
371c0 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61  g pCell */ ..  a
371d0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
371e0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
371f0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
37200 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
37210 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
37220 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
37230 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65  adOnly );.  asse
37240 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  rt( pCur->wrFlag
37250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61   );.  assert( ha
37260 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
37270 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70  eLock(p, pCur->p
37280 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70  gnoRoot, pCur->p
37290 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29  KeyInfo!=0, 2) )
372a0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73  ;.  assert( !has
372b0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
372c0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29   pCur->pgnoRoot)
372d0 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
372e0 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  (pCur->aiIdx[pCu
372f0 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d  r->iPage]>=pCur-
37300 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
37310 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20  age]->nCell) .  
37320 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
37330 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
37340 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72  ALID).  ){.    r
37350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
37360 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  OR;  /* Somethin
37370 67 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e  g has gone awry.
37380 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   */.  }..  /* If
37390 20 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74   this is a delet
373a0 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72  e operation to r
373b0 65 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d  emove a row from
373c0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
373d0 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  .  ** invalidate
373e0 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75   any incrblob cu
373f0 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
37400 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65  e row being dele
37410 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ted.  */.  if( p
37420 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
37430 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
37440 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
37450 73 28 70 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  s(p, pCur->info.
37460 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  nKey, 0);.  }.. 
37470 20 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43   iCellDepth = pC
37480 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65  ur->iPage;.  iCe
37490 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  llIdx = pCur->ai
374a0 49 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b  Idx[iCellDepth];
374b0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
374c0 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70  >apPage[iCellDep
374d0 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  th];.  pCell = f
374e0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
374f0 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20  CellIdx);..  /* 
37500 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  If the page cont
37510 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79  aining the entry
37520 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f   to delete is no
37530 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d  t a leaf page, m
37540 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ove.  ** the cur
37550 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65  sor to the large
37560 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
37570 74 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61  tree that is sma
37580 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74  ller than.  ** t
37590 68 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64  he entry being d
375a0 65 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c  eleted. This cel
375b0 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74  l will replace t
375c0 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  he cell being de
375d0 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20  leted.  ** from 
375e0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
375f0 65 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75 73  e. The 'previous
37600 27 20 65 6e 74 72 79 20 69 73 20 75 73 65 64 20  ' entry is used 
37610 66 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61 64  for this instead
37620 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65  .  ** of the 'ne
37630 78 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68  xt' entry, as th
37640 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
37650 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 61 72   is always a par
37660 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75  t of the.  ** su
37670 62 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79  b-tree headed by
37680 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
37690 6f 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e  of the cell bein
376a0 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20  g deleted. This 
376b0 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e  makes.  ** balan
376c0 63 69 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f  cing the tree fo
376d0 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65  llowing the dele
376e0 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73  te operation eas
376f0 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  ier.  */.  if( !
37700 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
37710 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
37720 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37730 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
37740 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20  ur, &notUsed);. 
37750 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
37760 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
37770 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
37780 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
37790 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
377a0 20 74 68 69 73 20 74 61 62 6c 65 20 62 65 66 6f   this table befo
377b0 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20 61  re.  ** making a
377c0 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
377d0 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 67 65 20  . Make the page 
377e0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
377f0 6e 74 72 79 20 74 6f 20 62 65 20 0a 20 20 2a 2a  ntry to be .  **
37800 20 64 65 6c 65 74 65 64 20 77 72 69 74 61 62 6c   deleted writabl
37810 65 2e 20 54 68 65 6e 20 66 72 65 65 20 61 6e 79  e. Then free any
37820 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
37830 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
37840 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79 20  the .  ** entry 
37850 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d 6f  and finally remo
37860 76 65 20 74 68 65 20 63 65 6c 6c 20 69 74 73 65  ve the cell itse
37870 6c 66 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  lf from within t
37880 68 65 20 70 61 67 65 2e 20 20 0a 20 20 2a 2f 0a  he page.  .  */.
37890 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
378a0 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
378b0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
378c0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
378d0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
378e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
378f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
37900 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
37910 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 63  urn rc;.  rc = c
37920 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
37930 70 43 65 6c 6c 29 3b 0a 20 20 64 72 6f 70 43 65  pCell);.  dropCe
37940 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49  ll(pPage, iCellI
37950 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
37960 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 2c 20 26  pPage, pCell), &
37970 72 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  rc);.  if( rc ) 
37980 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
37990 20 49 66 20 74 68 65 20 63 65 6c 6c 20 64 65 6c   If the cell del
379a0 65 74 65 64 20 77 61 73 20 6e 6f 74 20 6c 6f 63  eted was not loc
379b0 61 74 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 70  ated on a leaf p
379c0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
379d0 72 73 6f 72 0a 20 20 2a 2a 20 69 73 20 63 75 72  rsor.  ** is cur
379e0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
379f0 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  to the largest e
37a00 6e 74 72 79 20 69 6e 20 74 68 65 20 73 75 62 2d  ntry in the sub-
37a10 74 72 65 65 20 68 65 61 64 65 64 0a 20 20 2a 2a  tree headed.  **
37a20 20 62 79 20 74 68 65 20 63 68 69 6c 64 2d 70 61   by the child-pa
37a30 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  ge of the cell t
37a40 68 61 74 20 77 61 73 20 6a 75 73 74 20 64 65 6c  hat was just del
37a50 65 74 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 74  eted from an int
37a60 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 2e  ernal.  ** node.
37a70 20 54 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   The cell from t
37a80 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 6e 65 65  he leaf node nee
37a90 64 73 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 74  ds to be moved t
37aa0 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 20  o the internal. 
37ab0 20 2a 2a 20 6e 6f 64 65 20 74 6f 20 72 65 70 6c   ** node to repl
37ac0 61 63 65 20 74 68 65 20 64 65 6c 65 74 65 64 20  ace the deleted 
37ad0 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 69 66 28 20  cell.  */.  if( 
37ae0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
37af0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65      MemPage *pLe
37b00 61 66 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  af = pCur->apPag
37b10 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
37b20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
37b30 20 20 20 50 67 6e 6f 20 6e 20 3d 20 70 43 75 72     Pgno n = pCur
37b40 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65  ->apPage[iCellDe
37b50 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  pth+1]->pgno;.  
37b60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
37b70 2a 70 54 6d 70 3b 0a 0a 20 20 20 20 70 43 65 6c  *pTmp;..    pCel
37b80 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65  l = findCell(pLe
37b90 61 66 2c 20 70 4c 65 61 66 2d 3e 6e 43 65 6c 6c  af, pLeaf->nCell
37ba0 2d 31 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  -1);.    nCell =
37bb0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c 65   cellSizePtr(pLe
37bc0 61 66 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  af, pCell);.    
37bd0 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f  assert( MX_CELL_
37be0 53 49 5a 45 28 70 42 74 29 3e 3d 6e 43 65 6c 6c  SIZE(pBt)>=nCell
37bf0 20 29 3b 0a 0a 20 20 20 20 61 6c 6c 6f 63 61 74   );..    allocat
37c00 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
37c10 0a 20 20 20 20 70 54 6d 70 20 3d 20 70 42 74 2d  .    pTmp = pBt-
37c20 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 20  >pTmpSpace;..   
37c30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
37c40 65 72 57 72 69 74 65 28 70 4c 65 61 66 2d 3e 70  erWrite(pLeaf->p
37c50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 6e 73  DbPage);.    ins
37c60 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ertCell(pPage, i
37c70 43 65 6c 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34  CellIdx, pCell-4
37c80 2c 20 6e 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c  , nCell+4, pTmp,
37c90 20 6e 2c 20 26 72 63 29 3b 0a 20 20 20 20 64 72   n, &rc);.    dr
37ca0 6f 70 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c  opCell(pLeaf, pL
37cb0 65 61 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43  eaf->nCell-1, nC
37cc0 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  ell, &rc);.    i
37cd0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
37ce0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c  c;.  }..  /* Bal
37cf0 61 6e 63 65 20 74 68 65 20 74 72 65 65 2e 20 49  ance the tree. I
37d00 66 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65  f the entry dele
37d10 74 65 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20  ted was located 
37d20 6f 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a  on a leaf page,.
37d30 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75    ** then the cu
37d40 72 73 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74  rsor still point
37d50 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20  s to that page. 
37d60 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
37d70 20 66 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c   first.  ** call
37d80 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65   to balance() re
37d90 70 61 69 72 73 20 74 68 65 20 74 72 65 65 2c 20  pairs the tree, 
37da0 61 6e 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20  and the if(...) 
37db0 63 6f 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a  condition is.  *
37dc0 2a 20 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20  * never true..  
37dd0 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  **.  ** Otherwis
37de0 65 2c 20 69 66 20 74 68 65 20 65 6e 74 72 79 20  e, if the entry 
37df0 64 65 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61  deleted was on a
37e00 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  n internal node 
37e10 70 61 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  page, then.  ** 
37e20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
37e30 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67   to the leaf pag
37e40 65 20 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63  e from which a c
37e50 65 6c 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20  ell was removed 
37e60 74 6f 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20  to.  ** replace 
37e70 74 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64  the cell deleted
37e80 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
37e90 61 6c 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  al node. This is
37ea0 20 73 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74   slightly.  ** t
37eb0 72 69 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61  ricky as the lea
37ec0 66 20 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e  f node may be un
37ed0 64 65 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65  derfull, and the
37ee0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d   internal node m
37ef0 61 79 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65  ay.  ** be eithe
37f00 72 20 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66  r under or overf
37f10 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ull. In this cas
37f20 65 20 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63  e run the balanc
37f30 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20  ing algorithm.  
37f40 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e  ** on the leaf n
37f50 6f 64 65 20 66 69 72 73 74 2e 20 49 66 20 74 68  ode first. If th
37f60 65 20 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65  e balance procee
37f70 64 73 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70  ds far enough up
37f80 20 74 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74   the.  ** tree t
37f90 68 61 74 20 77 65 20 63 61 6e 20 62 65 20 73 75  hat we can be su
37fa0 72 65 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62  re that any prob
37fb0 6c 65 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72  lem in the inter
37fc0 6e 61 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a  nal node has.  *
37fd0 2a 20 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64  * been corrected
37fe0 2c 20 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65  , so be it. Othe
37ff0 72 77 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c  rwise, after bal
38000 61 6e 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20  ancing the leaf 
38010 6e 6f 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20  node,.  ** walk 
38020 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 68  the cursor up th
38030 65 20 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e  e tree to the in
38040 74 65 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20  ternal node and 
38050 62 61 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20  balance it as . 
38060 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   ** well.  */.  
38070 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75  rc = balance(pCu
38080 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
38090 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d  LITE_OK && pCur-
380a0 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74  >iPage>iCellDept
380b0 68 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  h ){.    while( 
380c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c  pCur->iPage>iCel
380d0 6c 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20  lDepth ){.      
380e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
380f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
38100 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a  Page--]);.    }.
38110 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
38120 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
38130 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
38140 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
38150 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ot(pCur);.  }.  
38160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
38170 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
38180 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
38190 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
381a0 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
381b0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
381c0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
381d0 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
381e0 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
381f0 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
38200 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
38210 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
38220 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
38230 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
38240 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
38250 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
38260 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
38270 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
38280 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
38290 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
382a0 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
382b0 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
382c0 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
382d0 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
382e0 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
382f0 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
38300 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74   indices.*/.stat
38310 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61  ic int btreeCrea
38320 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
38330 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
38340 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74  int flags){.  Bt
38350 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
38360 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
38370 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
38380 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
38390 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
383a0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
383b0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
383c0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
383d0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
383e0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
383f0 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
38400 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
38410 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
38420 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  UM.  rc = alloca
38430 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
38440 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
38450 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28  ot, 1, 0);.  if(
38460 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
38470 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  n rc;.  }.#else.
38480 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
38490 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
384a0 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
384b0 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
384c0